Optimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos

  1. Inicio
  2. Blog
  3. Bases de datos y SQL

Bases de datos y SQL

Optimización de consultas SQL: Leer planes de ejecución y corregir consultas lentas, con tiempos

Deja de adivinar por qué una consulta es lenta. Aprenda a leer un plan de ejecución y luego aplique las correcciones más importantes, con mediciones de antes y después de una tabla real de un millón de filas.

9 min de lectura
Optimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos

Puntos clave

  • Comience con el plan de ejecución. Le dice lo que realmente hace la base de datos.
  • Busque análisis completos en tablas grandes y luego agregue índices que coincidan con sus filtros y combinaciones.
  • Evite ajustar una columna indexada en una función, ya que esto puede impedir el uso eficiente del índice.
  • Mida el antes y el después, porque cada base de datos y conjunto de datos se comporta de manera diferente.

Una consulta que tardó milisegundos el año pasado puede tardar minutos hoy, simplemente porque la tabla creció. La optimización de consultas SQL se trata menos de trucos inteligentes y más de un proceso repetible: descubra qué está haciendo la base de datos, elimine el trabajo desperdiciado y compruebe que haya ayudado.

Probamos cada técnica a continuación en un millón de filas generadas en SQLite 3.50. Los tiempos son los mejores de varias ejecuciones desde una computadora portátil, utilizando una base de datos en memoria. No coincidirán con su sistema, y ​​PostgreSQL, MySQL y SQL Server tienen cada uno sus propios optimizadores y formatos de plan. Concéntrese en el tamaño de cada mejora y en los principios que la sustentan.

Resultados de un vistazo

Técnica antes después
Índice en la columna de filtro 73 ms 0,01 ms
Rango en lugar de una función en una columna 96 ms 33 ms
Índice compuesto para dos filtros. 19 ms 2,2 ms
Conjunto de teclas en lugar de OFFSET profundo 8,1 ms 0,01 ms

La configuración de la prueba

CREATE TABLE customers (
  id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
  id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
  created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values

Un proceso de optimización simple

  1. Encuentre las consultas que importan. Utilice registros de consultas lentos o monitoreo. Una consulta de 200 ms que se ejecuta mil veces por minuto puede importar más que un informe mensual de 10 segundos.
  2. Lea el plan. Vea lo que realmente está haciendo la base de datos.
  3. Cambie una cosa. Agregue un índice o reescriba parte de la consulta.
  4. Mida nuevamente, con datos realistas. Un plan de 100 filas de prueba dice muy poco sobre un millón.
  5. Míralo a lo largo del tiempo. Los planes pueden cambiar a medida que los datos crecen y las estadísticas cambian.

Leer un plan de ejecución

Un plan de ejecución es la estrategia paso a paso de la base de datos para ejecutar una consulta, incluido qué índices utiliza y en qué orden une las tablas. Prefije una consulta para verla:

Base de datos Comando
SQLite EXPLICAR CONSULTA PLAN SELECCIONAR...
PostgreSQL EXPLICAR ANALIZAR SELECCIONAR...
mysql EXPLAIN SELECT ... o EXPLAIN ANALYZE
Servidor SQL Plan de ejecución real en SSMS

Tenga en cuenta que EXPLAIN ANALYZE en PostgreSQL realmente ejecuta la consulta, así que tenga cuidado al usarlo con UPDATE o DELETE. Esto es lo que debe buscar primero:

Ya ves Significado Generalmente
Escaneo o escaneo secuencial Lee toda la tabla Una preocupación en las mesas grandes
Búsqueda o búsqueda de índice Salta a filas coincidentes bueno
Índice de cobertura Respondido solo desde el índice. Muy bueno
Árbol B temporal o clasificación Trabajo de clasificación adicional Vale la pena comprobarlo

Un análisis completo no es automáticamente malo. Si una consulta necesita la mayor parte de una tabla pequeña, el escaneo puede ser la opción más rápida. En PostgreSQL EXPLAIN ANALYZE, también compare las filas estimadas con las filas reales. Una gran diferencia a menudo significa que las estadísticas de las tablas están desactualizadas.

Añade el índice correcto

Esta consulta encuentra los pedidos de un cliente:

SELECT id, total FROM orders WHERE customer_id = 123;

Antes de agregar un índice, el plan era un escaneo completo:

SCAN orders
-- 20 rows in 73 ms

Luego agregamos un índice en la columna de filtro:

CREATE INDEX idx_orders_customer ON orders(customer_id);

SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms

Las mismas 20 filas regresaron miles de veces más rápido, porque la base de datos ya no leía un millón de filas para encontrarlas. Ninguna otra técnica en este artículo nos dio una ganancia mayor. Los primeros buenos candidatos son las columnas utilizadas en WHERE, JOIN y ORDER BY, especialmente cuando reducen los resultados a unas pocas filas. Nuestra guía de índices SQL explica cómo funcionan.

No ajuste columnas indexadas en funciones

Aquí hay dos formas de encontrar pedidos de marzo, con un índice en created:

-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms

-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms

Ambos devuelven filas idénticas, pero la primera tardó aproximadamente tres veces más. El plan muestra por qué: con una función en la columna, la base de datos no puede saltar a una posición en el índice ordenado, por lo que tiene que hacer SCAN en cada entrada. La versión de gama puede SEARCH ir directamente al lugar correcto. Una condición que puede utilizar un índice de esta manera se llama sargable.

El mismo problema aparece con estos patrones comunes:

evitar Prefiero
DONDE AÑO(creado) = 2026 DONDE creado >= '2026-01-01' Y creado < '2027-01-01'
DONDE precio * 2 > 100 DONDE precio > 50
DONDE INFERIOR(correo electrónico) = 'a@b.com' Un índice basado en funciones o una intercalación que no distingue entre mayúsculas y minúsculas
DONDE nombre COMO '%99' Una búsqueda de prefijo o búsqueda de texto completo

También comprobamos este último. Se produce un comodín inicial SCAN customers, ya que un índice ordenado desde la primera letra no puede ayudar con una coincidencia al final.

Índices compuestos

Cuando una consulta filtra dos columnas, un índice de una sola columna hace solo una parte del trabajo:

SELECT id FROM orders
WHERE status = 'paid'
  AND created >= '2026-03-01' AND created < '2026-03-08';

-- Using only the created index: 6,198 rows in 19 ms

CREATE INDEX idx_status_created ON orders(status, created);

-- SEARCH orders USING COVERING INDEX idx_status_created
--   (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms

El orden de las columnas es muy importante. Un índice en (status, created) funciona como una guía telefónica ordenada por apellido y luego por nombre. Puede buscar solo el apellido, pero no solo el nombre. Nuestra consulta sobre status por sí sola podría utilizar este índice. El filtrado por created por sí solo generalmente no permite utilizarlo de manera eficiente. Como regla general, coloque las columnas probadas con igualdad primero y las columnas de rango después de ellas.

Ese plan también dice índice de cobertura, lo que significa que el índice contenía todo lo que la consulta necesitaba, por lo que no era necesario leer la tabla en sí. Seleccionar solo las columnas que necesita hace que esto sea más probable, lo cual es otra razón para evitarlo SELECT *.

Paginación más rápida

Usar OFFSET para páginas profundas tiene un costo oculto, ya que la base de datos aún tiene que pasar por todas las filas omitidas:

-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms

-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms

La paginación del conjunto de claves se mantiene rápida sin importar qué tan profundo vayas. También evita que las filas cambien entre páginas cuando se agregan nuevos datos. La desventaja es que los usuarios no pueden pasar directamente a la página 5000, lo que rara vez es una necesidad real. En tablas con filas anchas, o con más filas para omitir, la brecha puede ser mucho mayor que en nuestra prueba.

Consejo: Nuestros tiempos miden una consulta a la vez en una máquina inactiva. Bajo carga real, una consulta ineficiente causa más daño, porque también mantiene bloqueos y compite por la memoria, el disco y la CPU con todo lo demás.

Escriba consultas más sencillas

  • Seleccione solo las columnas que necesita. SELECT * envía más datos y puede evitar que un índice cubra la consulta.
  • Filtrar temprano. Utilice WHERE para eliminar filas antes de agruparlas y HAVING solo para condiciones en agregados. Consulte SQL GROUP BY y TENER.
  • Utilice LIMIT cuando solo necesite unas pocas filas.
  • Prefiera UNION ALL cuando no necesite eliminar duplicados. Nuestra prueba UNION vs UNION ALL muestra lo que eso ahorra.
  • Evite DISTINCT innecesario. A menudo se oculta una unión que produce duplicados.
  • Utilice EXISTS para comprobar la existencia. Puede detenerse en la primera coincidencia, como explica nuestra guía de subconsultas SQL.
  • Esté atento a las consultas N+1. Una consulta por fila en un bucle, generalmente causada por el código de la aplicación, suele ser el verdadero problema. Una única consulta de unión o por lotes puede reemplazar cientos de viajes de ida y vuelta.

Se une

Indexe las columnas a las que se une. Realizamos un informe de gasto total para los clientes en una ciudad y el plan era exactamente lo que esperaba:

SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;

-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms

Escanea a los clientes y luego utiliza un índice para encontrar los pedidos de cada uno. Sin un índice en orders.customer_id, la base de datos tendría que trabajar mucho más para cada cliente. Un índice de la clave externa es una de las adiciones más comunes y valiosas que puede realizar. Para actualizar su comprensión de los conceptos básicos, consulte Explicación de uniones SQL.

Cuando los índices te cuestan

Los índices no son gratuitos, así que no agregues uno para cada columna:

  • Escrituras más lentas. Cada inserción, actualización y eliminación también debe actualizar cada índice.
  • Más almacenamiento y memoria. Los índices pueden crecer en tablas grandes.
  • Poco beneficio en columnas no selectivas. Un índice en una columna verdadera o falsa puede no ayudar si la mayoría de las filas coinciden.
  • Redundancia. Un índice en (a) a menudo es innecesario si ya tiene uno en (a, b).

Verifique las estadísticas de uso periódicamente y elimine los índices que no utiliza. Y mantenga las estadísticas actualizadas con ANALYZE o el equivalente de su base de datos, porque el optimizador depende de ellos para elegir un buen plan. A veces, la parte lenta es la contienda más que la consulta. Las transacciones de larga duración que mantienen bloqueos pueden hacer que una consulta rápida parezca lenta.

Errores comunes

  • Optimizar sin medir. Muchas suposiciones seguras resultan erróneas.
  • Pruebas con datos pequeños. Los planes y tiempos cambian dramáticamente a medida que las tablas crecen.
  • Confiar en un consejo para otra base de datos. Es posible que los consejos para un motor no se apliquen a otro.
  • Agregar índices a ciegas. Cada uno ralentiza la escritura.
  • Ignorando el efecto de la primera ejecución. Los cachés hacen que la segunda ejecución sea más rápida, así que ejecútala varias veces.

Conclusión

La mayoría de las consultas lentas tienen causas comunes: falta un índice, una función en una columna o se están recuperando demasiados datos. Realice su consulta real más lenta esta semana, ejecute EXPLAIN en ella y busque un escaneo completo en una tabla grande. Arregle una cosa, mida nuevamente y tome notas de lo que cambió.

Preguntas frecuentes

¿Qué es la optimización de consultas SQL?

Es el proceso de hacer que las consultas utilicen menos tiempo y menos recursos, generalmente examinando los planes de ejecución, agregando índices adecuados y reescribiendo consultas ineficientes.

¿Qué es un plan de ejecución?

Es la estrategia elegida por la base de datos para ejecutar una consulta, incluyendo cómo lee las tablas, qué índices utiliza y en qué orden se une.

¿Cómo encuentro consultas lentas?

Habilite el registro de consultas lentas de su base de datos o utilice herramientas como pg_stat_statements en PostgreSQL. Luego, céntrese en las consultas con el mayor tiempo total.

¿Agregar un índice siempre hace que las consultas sean más rápidas?

No. Ayuda a las lecturas selectivas pero ralentiza las escrituras y utiliza el almacenamiento. El optimizador también puede ignorarlo si la mayoría de las filas coinciden con la condición.

¿SELECT * es malo para el rendimiento?

Puede ser. Transfiere datos innecesarios y puede evitar que un índice cubra la consulta. Generalmente es mejor enumerar sólo las columnas que necesita.

sigue aprendiendo

Trabajar con Stack Quora

¿Necesitas ayuda con pruebas, WordPress o SEO?

Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.

Sigue leyendo

Más guías sobre testing, IA y desarrollo moderno

¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.

Inteligencia artificial

Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas

Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…

Leer artículo →
DevOps

Explicación de las variables de entorno: archivos .env, secretos y configuración bien hechos

Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…

Leer artículo →
Desarrollo de software

Explicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429

La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …

Leer artículo →
Automatización de pruebas

Burlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan

Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…

Leer artículo →
Pruebas de software

Explicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%

Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…

Leer artículo →
Bases de datos y SQL

DELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno

DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…

Leer artículo →
Bases de datos y SQL

Vistas SQL explicadas: cree, use y evite los errores, con ejemplos

Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…

Leer artículo →
Desarrollo de software

Interfaz TypeScript versus tipo: diferencias reales, probadas con el compilador

Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…

Leer artículo →
Desarrollo de software

Python *args y **kwargs explicados: funciones flexibles con ejemplos claros

Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…

Leer artículo →
Desarrollo de software

Funciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas

Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…

Leer artículo →
Inteligencia artificial

¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar

¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…

Leer artículo →
DevOps

Monitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos

Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…

Leer artículo →
DevOps

Docker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta

Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…

Leer artículo →
Automatización de pruebas

TDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una

TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …

Leer artículo →
Pruebas de software

Pruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales

Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…

Leer artículo →
Bases de datos y SQL

Valores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar

Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…

Leer artículo →
Bases de datos y SQL

Declaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes

CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…

Leer artículo →
Desarrollo de software

¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico

¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…

Leer artículo →
Desarrollo de software

Explicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos

El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…

Leer artículo →
Desarrollo de software

Explicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales

Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…

Leer artículo →
Inteligencia artificial

¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla

¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…

Leer artículo →
DevOps

Implementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir

Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…

Leer artículo →
Automatización de pruebas

Pruebas inestables: qué las causa y cómo solucionarlas para siempre

Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…

Leer artículo →
Pruebas de software

Pruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6

Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…

Leer artículo →
Pruebas de software

Caso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno

Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…

Leer artículo →
Bases de datos y SQL

Optimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos

Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…

Leer artículo →
Bases de datos y SQL

SQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado

SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …

Leer artículo →
Desarrollo de software

Tutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera

Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…

Leer artículo →
Desarrollo de software

Manejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos

El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…

Leer artículo →
Desarrollo de software

Clases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales

Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…

Leer artículo →
Inteligencia artificial

¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones

¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…

Leer artículo →
DevOps

Comandos de Linux para principiantes: la guía esencial de terminal con ejemplos

Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…

Leer artículo →
Automatización de pruebas

Selenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir

Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…

Leer artículo →
Pruebas de software

Partición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos

Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …

Leer artículo →
Pruebas de software

Severidad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales

Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…

Leer artículo →
Bases de datos y SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos

Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…

Leer artículo →
Bases de datos y SQL

Transacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento

Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…

Leer artículo →
Desarrollo de software

Hoja de trucos de comandos de Git: los comandos que realmente usas, con ejemplos

Una hoja de referencia de comandos de Git agrupada por tarea: configuración, preparación, ramas, controles remotos, almacenamiento, historial y desh…

Leer artículo →
Desarrollo de software

Explicación de las promesas de JavaScript: luego, captura, Promise.all y errores comunes

Las promesas de JavaScript se explican con el código que ejecutamos: estados, luego y cadenas de captura, manejo de errores, Promise.all, allSettled…

Leer artículo →
Desarrollo de software

Tutorial del diccionario Python: métodos, ejemplos y patrones comunes

Un tutorial de diccionario de Python con el código que ejecutamos: crear, leer y actualizar dictados, métodos clave, fusión, comprensión, patrones d…

Leer artículo →
Inteligencia artificial

¿Qué es el RAG? Generación de recuperación aumentada explicada con un ejemplo práctico

¿Qué es RAG? Generación de recuperación aumentada explicada paso a paso: indexación, fragmentación, incrustaciones, recuperación, un pequeño ejemplo…

Leer artículo →
DevOps

Tutorial de Terraform para principiantes: infraestructura como código desde el primer archivo hasta los módulos

Un tutorial de Terraform para principiantes: comience sin una cuenta en la nube, aprenda init, planifique y aplique, luego variables, resultados, es…

Leer artículo →
DevOps

Docker vs Kubernetes: diferencias clave, cómo funcionan juntos y cuál necesita

Docker vs Kubernetes explicó: qué hace cada uno, la misma aplicación se ejecuta con ambos, se comparan Docker Compose y Swarm, los Dockershim cambia…

Leer artículo →
Automatización de pruebas

Tutorial de Pytest para principiantes: accesorios, parametrización y ejemplos reales

Un tutorial de pytest para principiantes con pruebas que ejecutamos en pytest 9.2: afirmaciones, accesorios, parametrización, conftest, marcadores, …

Leer artículo →
Pruebas de software

Ciclo de vida de pruebas de software (STLC): 6 fases, criterios de entrada y salida, ejemplo

Se explicó el ciclo de vida de las pruebas de software: seis fases de STLC con criterios de entrada y salida, entregables, un ejemplo de función de …

Leer artículo →
Desarrollo de software

Git merge vs rebase: diferencias, ejemplos y cuándo usar cada uno

Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.

Leer artículo →
Desarrollo de software

List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.

Leer artículo →