What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
Un índice de base de datos es una estructura auxiliar que permite localizar filas usando una o varias columnas sin recorrer toda la tabla. Bien diseñado, puede reducir de forma considerable las lecturas y la latencia de consultas frecuentes; mal elegido, consume almacenamiento y hace más lentas las operaciones de escritura.
La regla esencial es sencilla: no crees índices al azar. Identifica una consulta lenta, examina su plan de ejecución, crea el índice mínimo que encaje con su patrón y vuelve a medirlo con datos representativos.
Qué es exactamente un índice de base de datos
Un índice almacena valores de una o más columnas en una organización que facilita encontrar las filas correspondientes. Según el motor, puede guardar referencias hacia las páginas de datos o formar parte de la propia organización física de la tabla. No suele ser una copia completa de la tabla: es una estructura optimizada para determinadas formas de acceso.
La analogía habitual es el índice de un libro. Si buscas una palabra, no lees todas las páginas: consultas el índice, obtienes una referencia y vas a la página indicada. La comparación no es perfecta: en una base de datos todavía puede ser necesario acceder a la fila después de encontrar la entrada del índice, mientras que un índice clustered puede organizar los propios datos.
#1 Best Overall
Un índice no cambia normalmente el resultado lógico de una consulta. Cambia la forma física en que el motor obtiene ese resultado. El optimizador compara distintas alternativas y elige el plan cuyo coste estimado considera menor.
La documentación de PostgreSQL, MySQL y SQL Server coincide en el principio general: los índices pueden acelerar búsquedas, pero también ocupan espacio y deben mantenerse cuando se insertan, actualizan o eliminan filas.
Cómo funciona un índice B-tree o B+ tree
El árbol B es el tipo más común en muchas cargas relacionales. Mantiene las claves ordenadas y balancea sus niveles para que la búsqueda no dependa demasiado de la posición concreta del valor.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan → [50]
/
[10, 20] [70, 90]
/ | / |
... ... ... ... ... ...
Para buscar una clave, el motor comienza en la raíz, selecciona la rama correspondiente y desciende hasta las hojas. Las hojas ordenadas también facilitan las búsquedas por rango y ciertos recorridos con ORDER BY. SQL Server describe sus índices rowstore como estructuras B+ tree; PostgreSQL documenta su implementación B-tree y sus propiedades en la guía oficial de B-tree.
Decir que una búsqueda en un árbol tiene un coste teórico cercano a O(log n) es una simplificación útil, no una promesa de velocidad. El resultado real depende del tamaño de la tabla, la cardinalidad, la distribución de valores, la caché, el almacenamiento, la concurrencia, las estadísticas y el plan completo, incluidos los JOIN y el acceso final a las filas.
Qué ocurre con y sin índice
Considera esta consulta:
SELECT *
FROM clientes
WHERE email = '[email protected]';
Sin un índice adecuado sobre email, el motor puede tener que examinar muchas o todas las filas. En PostgreSQL suele hablarse de sequential scan; en otros motores puede aparecer como table scan. Con un índice, puede encontrar las entradas candidatas y acceder después a las filas necesarias.
Pero la existencia del índice no obliga al optimizador a utilizarlo. Si la consulta devuelve una proporción grande de la tabla, recorrerla de forma secuencial puede ser más barato que buscar en el índice y realizar numerosos accesos aleatorios a los datos. Una tabla pequeña también puede leerse completa con un coste insignificante.
Recommended Free Tools
Qué consultas suelen beneficiarse
Los índices son candidatos especialmente razonables cuando una consulta:
- Filtra por igualdad, por ejemplo
WHERE email = '[email protected]'. - Busca rangos, como
WHERE created_at >= '2026-01-01'. - Ordena con frecuencia mediante
ORDER BY. - Relaciona tablas mediante
JOIN. - Usa agrupaciones que coinciden con un patrón de acceso útil para el motor.
- Devuelve pocas filas en comparación con el tamaño total de la tabla.
- Se ejecuta con mucha frecuencia o afecta a una ruta crítica de la aplicación.
- Necesita imponer unicidad sobre una columna o combinación de columnas.
Un índice no es una solución universal. Puede aportar poco o nada cuando la consulta devuelve la mayoría de las filas, la columna tiene pocos valores distintos, las estadísticas están desactualizadas, se aplica una función incompatible o el cuello de botella real está en un JOIN, un SORT, un bloqueo, la red o la aplicación.
Ejemplo: filtrar y ordenar pedidos
Supón esta consulta:
SELECT id, fecha_creacion
FROM pedidos
WHERE cliente_id = 42
ORDER BY fecha_creacion DESC;
Sin un índice apropiado, el motor podría leer muchos pedidos y ordenar después el resultado. Un índice compuesto como este puede encajar mejor con el patrón:
CREATE INDEX idx_pedidos_cliente_fecha
ON pedidos (cliente_id, fecha_creacion DESC);
El motor puede localizar primero los pedidos del cliente 42 y recorrer sus fechas en el orden necesario. La sintaxis y el efecto exactos de ASC y DESC dependen del motor y de la versión; algunos pueden recorrer en sentido inverso un índice creado en orden ascendente.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallCrashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteSi la consulta solicita columnas que no están disponibles directamente en el índice, puede ser necesario un acceso adicional a la tabla. Por eso el plan de ejecución, y no la intuición, es la prueba decisiva.
Tipos de índices
Índice simple
Se construye sobre una columna:
CREATE INDEX idx_clientes_email
ON clientes (email);
Es apropiado si las consultas filtran u ordenan repetidamente por esa columna. No significa que todas las consultas que la mencionen vayan a utilizarlo.
Índice compuesto o multicolumna
Incluye dos o más columnas:
CREATE INDEX idx_pedidos_cliente_fecha
ON pedidos (cliente_id, fecha_creacion);
El orden importa. Este índice suele ser útil para WHERE cliente_id = 42 y para una condición que restringe primero cliente_id y después un rango de fechas. No equivale automáticamente a tener dos índices independientes, (cliente_id) y (fecha_creacion). La utilidad depende de los predicados, los rangos, la ordenación, la distribución y el plan elegido. Consulta la documentación de índices multicolumna de PostgreSQL y la guía de diseño de SQL Server.
No conviertas la regla “poner primero la columna más selectiva” en una ley universal. Una columna menos selectiva puede ser la primera si coincide con el filtro principal, la segmentación de la aplicación o el orden de las consultas más importantes.
Índice único
CREATE UNIQUE INDEX idx_usuarios_email
ON usuarios (email);
Además de servir para búsquedas, impide duplicados en la clave, sujeto a las reglas de valores nulos del motor. Una restricción UNIQUE también puede crear un índice automáticamente, por lo que conviene comprobar qué existe antes de añadir otro.
Clustered y nonclustered
En SQL Server, un índice clustered organiza y almacena las filas de la tabla según su clave. Solo puede existir uno por tabla porque las filas no pueden almacenarse físicamente en varios órdenes distintos. Un índice nonclustered mantiene una estructura separada con claves y localizadores de filas; puede necesitar un segundo acceso para obtener columnas que no contiene.
Estos términos no deben trasladarse sin matices a todos los motores. PostgreSQL utiliza una tabla heap con índices separados y ofrece el comando CLUSTER para reorganizar físicamente una tabla, pero no funciona como el clustered index de SQL Server. El motor de almacenamiento también influye en MySQL.
Índice covering o de cobertura
Un índice cubre una consulta cuando contiene todas las columnas que necesita para filtrar, ordenar y devolver el resultado, evitando o reduciendo accesos adicionales a la tabla.
CREATE INDEX idx_pedidos_cliente_fecha
ON pedidos (cliente_id, fecha_creacion);
Puede cubrir:
SELECT cliente_id, fecha_creacion
FROM pedidos
WHERE cliente_id = 42;
SQL Server permite añadir columnas no clave mediante INCLUDE; PostgreSQL también admite columnas incluidas en ciertos índices. Sin embargo, un índice de cobertura no garantiza siempre un index-only scan. En PostgreSQL intervienen, entre otros factores, el tipo de índice y la visibilidad de las filas en el heap. Consulta la documentación de index-only scans.
Índice parcial o filtrado
Solo indexa las filas que cumplen una condición. En PostgreSQL:
CREATE INDEX idx_pedidos_pendientes
ON pedidos (fecha_creacion)
WHERE estado = 'pendiente';
Puede ser útil si una pequeña parte de la tabla concentra las consultas. PostgreSQL documenta los índices parciales; SQL Server ofrece filtered indexes con sintaxis y restricciones distintas.
Índice funcional o basado en expresión
Sirve cuando la consulta aplica sistemáticamente una expresión:
CREATE INDEX idx_usuarios_email_lower
ON usuarios (LOWER(email));
La consulta debe utilizar una expresión compatible:
SELECT *
FROM usuarios
WHERE LOWER(email) = '[email protected]';
Un índice normal sobre email no tiene por qué utilizarse automáticamente para LOWER(email). La disponibilidad y la sintaxis dependen del motor; PostgreSQL explica esta técnica en su documentación sobre índices sobre expresiones.
Índices especializados
Además de B-tree existen métodos orientados a necesidades concretas: hash, GIN para determinados datos y búsquedas invertidas, GiST y SP-GiST, BRIN para tablas muy grandes cuyos valores siguen aproximadamente el orden físico, índices espaciales y FULLTEXT para texto. No son intercambiables: la elección depende del operador, el tipo de dato y el motor. PostgreSQL resume sus métodos en la guía de índices.
Cómo crear un índice correctamente
1. Localiza la consulta problemática
Empieza con una consulta concreta, no con una lista de columnas “importantes”. Registra su frecuencia, tiempo medio, percentiles altos, filas examinadas, filas devueltas, lecturas y relación con la carga de escritura.
Rank #4
2. Inspecciona el plan
En PostgreSQL:
EXPLAIN (ANALYZE, BUFFERS)
SELECT *
FROM pedidos
WHERE cliente_id = 42
ORDER BY fecha_creacion DESC;
EXPLAIN muestra el plan elegido y ANALYZE ejecuta la consulta para añadir métricas reales. Utilízalo con especial cuidado en INSERT, UPDATE y DELETE, porque la sentencia se ejecutará realmente. Consulta EXPLAIN y Using EXPLAIN.
En MySQL:
EXPLAIN
SELECT *
FROM pedidos
WHERE cliente_id = 42
ORDER BY fecha_creacion DESC;
Las versiones modernas también pueden ofrecer:
EXPLAIN ANALYZE
SELECT *
FROM pedidos
WHERE cliente_id = 42
ORDER BY fecha_creacion DESC;
La disponibilidad exacta depende de la versión y del tipo de sentencia. Verifica la documentación de la versión desplegada en EXPLAIN de MySQL y Using EXPLAIN.
En SQL Server utiliza el plan estimado o real desde SQL Server Management Studio, Azure Data Studio u otra herramienta compatible. Busca Table Scan, Clustered Index Scan, Index Seek, Key Lookup, ordenaciones costosas y diferencias entre filas estimadas y reales. Las advertencias de índices faltantes son sugerencias, no órdenes automáticas.
3. Crea el índice mínimo
Para un filtro simple:
CREATE INDEX idx_pedidos_cliente
ON pedidos (cliente_id);
Para filtrar por cliente y ordenar por fecha:
CREATE INDEX idx_pedidos_cliente_fecha
ON pedidos (cliente_id, fecha_creacion DESC);
En producción, revisa también las opciones del motor, la concurrencia, los bloqueos y el impacto de construir el índice sobre una tabla grande. No asumas que esta sintaxis y sus opciones son idénticas en PostgreSQL, MySQL, SQL Server y Oracle.
Free tools Windows power users keep installed
One-click scans. No signup required.
4. Vuelve a medir
Compara el antes y el después:
- Tiempo total y percentiles de latencia.
- Lecturas lógicas y físicas.
- Filas examinadas frente a filas devueltas.
- Plan seleccionado.
- Consumo de CPU.
- Tiempo de
INSERT,UPDATEyDELETE. - Espacio, replicación, backups y comportamiento bajo carga.
Un índice es una hipótesis que debe validarse. Que el plan muestre un Index Seek no basta si el tiempo total, las lecturas o la carga de escritura empeoran.
Cómo decidir qué columnas indexar
Patrón real de consultas
Prioriza columnas que aparecen repetidamente en WHERE, JOIN y ORDER BY, además de restricciones de unicidad y claves primarias. No indexar todas las columnas evita estructuras redundantes y reduce el coste operativo.
Selectividad, cardinalidad y distribución
Una columna es atractiva cuando descarta una parte importante de las filas. email suele ser muy selectiva; country_code puede tener pocos valores y is_active normalmente tiene baja selectividad. Aun así, la decisión debe basarse en los datos reales: importan el porcentaje de filas devueltas, el tamaño de la tabla y la distribución, no solo el número de valores distintos.
Orden de un índice compuesto
Diseña el orden según las consultas principales:
CREATE INDEX idx_events_tenant_time
ON events (tenant_id, created_at);
Puede encajar si la mayoría de consultas restringe primero por tenant_id y después por fecha. Un rango en la primera columna puede limitar el uso eficiente de las columnas posteriores. La regla correcta se confirma con planes y datos representativos, no con una receta universal.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Coste de mantenimiento
Cada índice adicional puede consumir disco, caché y espacio de backup; aumentar el trabajo de inserción, actualización y borrado; elevar el coste de replicación; y añadir complejidad al optimizador y al diagnóstico. El coste es especialmente relevante en tablas de eventos, sistemas de alta escritura y tablas con columnas que cambian con frecuencia.
Best Value
Por qué un índice existente puede no utilizarse
- Devuelve demasiadas filas: un recorrido completo puede ser más barato.
- Baja selectividad: el índice no descarta suficiente información.
- Estadísticas desactualizadas: el optimizador calcula mal la cardinalidad.
- Función o conversión:
LOWER(email), conversiones de tipos o expresiones incompatibles pueden impedir usar un índice normal. - Orden compuesto inadecuado: el patrón de filtros no coincide con el prefijo útil del índice.
- Muchos accesos a la tabla: recuperar numerosas columnas desde muchas filas puede costar más que leer la tabla.
- Tabla pequeña: un escaneo completo puede ser la opción más rápida.
- Otro cuello de botella: el problema puede estar en un join, sort, bloqueo, red o código de aplicación.
- Patrón de búsqueda incompatible: no todos los operadores aprovechan todos los tipos de índice.
- Costes físicos: fragmentación, localidad o presión de caché pueden afectar según el motor.
La discrepancia entre filas estimadas y reales es una señal particularmente útil: puede indicar estadísticas, distribución o parámetros que el optimizador no está representando bien.
Cuándo no conviene crear un índice
- La tabla es pequeña y el escaneo completo ya es barato.
- La consulta devuelve gran parte de la tabla.
- La columna tiene baja selectividad y no forma parte de un patrón más útil.
- La tabla recibe muchas escrituras y el beneficio de lectura es marginal.
- Ya existe un índice equivalente o redundante.
- El índice solo responde a una consulta poco frecuente.
- El problema principal está fuera del acceso a datos.
Más índices no significa automáticamente más rendimiento. La clave primaria suele tener un índice asociado, pero eso no resuelve filtros por otras columnas, ordenaciones distintas ni todos los joins. Del mismo modo, un índice compuesto no sustituye siempre a varios índices simples: depende de los patrones de consulta.
Diferencias importantes entre motores
PostgreSQL
PostgreSQL ofrece B-tree, Hash, GiST, SP-GiST, GIN y BRIN, además de índices parciales, índices sobre expresiones y columnas INCLUDE. Sus índices se almacenan separadamente del heap de la tabla. Los index-only scans dependen también de la visibilidad de las filas. La herramienta habitual de diagnóstico es EXPLAIN, a menudo con ANALYZE y BUFFERS.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Repair Windows errors before they cause bigger problems3Scan for outdated or missing drivers - takes under a minuteFuentes: índices, index-only scans y EXPLAIN.
MySQL
La mayoría de los índices habituales de MySQL utiliza B-tree, con excepciones relacionadas con índices espaciales, tablas MEMORY y ciertos índices FULLTEXT. El motor de almacenamiento, especialmente InnoDB, influye en la organización y el acceso. Por eso deben distinguirse las características del servidor MySQL de las del motor de almacenamiento elegido. Consulta Optimización de índices.
SQL Server
SQL Server distingue clustered y nonclustered, permite columnas incluidas en índices no agrupados y puede crear índices mediante restricciones PRIMARY KEY y UNIQUE, según la definición existente. Sus planes, Query Store y recomendaciones pueden ser útiles, pero las sugerencias deben contrastarse con la carga real y el coste de escritura.
Fuentes: clustered y nonclustered y guía de diseño.
Errores frecuentes
- Crear un índice por cada columna: produce sobreindexación y costes de escritura.
- Ignorar el orden compuesto:
(a, b)no equivale automáticamente a(a)más(b). - No medir el plan anterior: sin una línea base no puedes demostrar una mejora.
- Aplicar funciones sin un índice compatible: una expresión puede dejar inutilizado el índice normal.
- Copiar una receta de otro motor: clustered, índices incluidos y mantenimiento no significan lo mismo en todas partes.
- Eliminar índices solo porque parecen no usados: primero observa un periodo que incluya las cargas periódicas y las ventanas de mantenimiento.
- Reconstruir o mantener todo automáticamente: las acciones dependen del motor, la versión, la fragmentación y la carga.
- Confundir indexación con escalado: un índice no sustituye la paginación, un esquema correcto, el particionado, las réplicas, la caché o la reescritura de una consulta.
¿Conviene una base de datos gestionada?
Antes de pagar por más CPU o almacenamiento, comprueba si el problema es una consulta sin índice, un índice mal diseñado o un plan ineficiente. Un servicio gestionado puede encargarse de backups, parches, alta disponibilidad y parte de la operación, pero no diseña automáticamente el índice correcto para cada aplicación.
Amazon RDS ofrece motores relacionales gestionados y cobra según instancia, almacenamiento, backups, transferencia, disponibilidad y motor; consulta su página oficial de precios. Google Cloud SQL gestiona MySQL, PostgreSQL y SQL Server; sus costes dependen de vCPU, memoria, almacenamiento, región, red y configuración, como explica su tarificación oficial. Azure SQL y los servicios de Azure para PostgreSQL y MySQL pueden encajar mejor en organizaciones que ya utilizan el ecosistema Microsoft.
Compara el coste total: tiempo de infraestructura, backups y recuperación, alta disponibilidad, réplicas, monitorización, cumplimiento, transferencia y dependencia del proveedor. Para diagnosticar índices, empieza por las herramientas nativas: EXPLAIN en PostgreSQL y MySQL, y planes de ejecución y Query Store en SQL Server. La observabilidad comercial puede aportar historial, alertas y correlación entre CPU, I/O, bloqueos y latencia, pero no sustituye el análisis del plan.
Quick Recap
Checklist antes de aprobar un índice
- ¿Qué consulta concreta quieres acelerar?
- ¿Cuál es su plan actual?
- ¿Cuántas filas devuelve frente al tamaño de la tabla?
- ¿Qué columnas filtra, une u ordena?
- ¿Existe ya un índice equivalente o una restricción que lo haya creado?
- ¿El orden del índice compuesto coincide con el patrón real?
- ¿Cuál será el coste en espacio, caché, escrituras, backups y replicación?
- ¿El nuevo plan mejora lecturas, CPU y latencia?
- ¿La mejora se mantiene bajo una carga representativa?
- ¿El problema podría resolverse mejor cambiando la consulta, el esquema o la estrategia de escalado?
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

