Aikido

Por qué evitar los índices redundantes en las bases de datos: optimizar el almacenamiento y el rendimiento de escritura

Rendimiento

Regla

Evite redundante base de datos redundantes.
La superposición de base de datos índices de bases de datos desperdician
almacenamiento y ralentizan ralentizan escribe.

Lenguajes compatibles: SQL

Introducción

Los índices redundantes se producen cuando varios índices cubren las mismas columnas o cuando un índice es prefijo de otro. Cada índice consume espacio en disco y debe actualizarse en las operaciones INSERT, UPDATE y DELETE. Una tabla con cinco índices superpuestos sobre columnas similares paga cinco veces la penalización de rendimiento de escritura, mientras que un solo índice bastaría para optimizar la lectura.

Por qué es importante

Impacto en el rendimiento: Cada índice ralentiza las operaciones de escritura porque la base de datos debe actualizar todos los índices cuando cambian los datos. Los índices redundantes multiplican este coste sin aportar ventajas a la consulta. Una tabla con tres índices redundantes en usuario_id triplica la sobrecarga de escritura mientras que sólo se utiliza un índice.

Costes de almacenamiento: Los índices consumen un espacio en disco proporcional al tamaño de las columnas indexadas y al número de filas. Los índices redundantes desperdician espacio de almacenamiento que podría utilizarse para datos reales o índices útiles. Las tablas grandes con índices innecesarios pueden desperdiciar gigabytes de almacenamiento.

Complejidad del mantenimiento: Más índices significa más objetos que supervisar, analizar y mantener. Los administradores de bases de datos dedican tiempo a optimizar índices que no aportan ningún valor. Los planificadores de consultas tienen más opciones que evaluar, pudiendo elegir planes de ejecución subóptimos.

Ejemplos de códigos

❌ No conforme:

-- Índices redundantes en la tabla users
CREAR INDEX idx_users_email ON users(email);
CREAR INDEX idx_users_email_status ON users(email, status);
CREAR INDEX idx_users_created ON users(created_at);
CREAR INDEX idx_users_created_status ON users(created_at, status);

-- Los índices de una sola columna son redundantes porque
-- los índices compuestos pueden servir para las mismas consultas

Por qué está mal: El índice del correo electrónico es redundante porque idx_users_email_status comienza con correo electrónico y puede gestionar consultas filtrando sólo por correo electrónico. De forma similar, idx_usuarios_creados es redundante con idx_users_created_status. Cada inserción o actualización de esta tabla actualiza cuatro índices cuando bastaría con dos.

✅ Conforme:

-- Índices optimizados en la tabla users
CREAR INDEX idx_users_email_status ON users(email, status);
CREAR INDEX idx_users_created_status ON users(created_at, status);

-- Los índices compuestos pueden servir consultas sobre sus columnas prefijadas
-- Las consultas sólo sobre email usan idx_users_email_status
-- Las consultas sólo sobre created_at utilizan idx_users_created_status

Por qué es importante: Dos índices compuestos sirven para todos los patrones de consulta y eliminan la redundancia. Las consultas filtradas por correo electrónico sólo utilizan el primer índice, y las consultas que filtran por fecha_de_creación sólo utilizan el segundo. El rendimiento de escritura mejora porque sólo hay que actualizar dos índices en lugar de cuatro.

Conclusión

Audite regularmente los índices de su base de datos para identificar los redundantes. Elimine los índices que sean prefijos de otros índices o que dupliquen la cobertura. Los índices compuestos pueden servir consultas en sus columnas principales, eliminando la necesidad de índices separados de una sola columna en la mayoría de los casos.

Preguntas frecuentes

¿Tiene alguna pregunta?

¿Cómo identifico los índices redundantes en mi base de datos?

Consulte las tablas del sistema de su base de datos para obtener una lista de todos los índices. Para PostgreSQL, utilice la vista pg_indexes. En MySQL, utilice SHOW INDEX FROM nombre_tabla. Busque índices en los que uno sea prefijo de otro (email frente a email+status) o en los que varios índices cubran las mismas columnas en distintos órdenes.

¿Cuándo un índice de una sola columna no es redundante con un índice compuesto?

Cuando la selectividad de la consulta importa. Si se consulta con frecuencia sólo la segunda columna de un índice compuesto, esa consulta no puede utilizar el índice de forma eficiente. Un índice sobre (estado, correo electrónico) no ayudará a las consultas que filtren sólo por correo electrónico. Sin embargo, un índice sobre (correo electrónico, estado) puede servir para consultas sobre sólo el correo electrónico.

¿Cómo afectan los índices redundantes al rendimiento de las consultas?

Mínimo para las lecturas, significativo para las escrituras. El planificador de consultas puede elegir entre índices redundantes, pero el tiempo de ejecución es similar. Sin embargo, cada escritura (INSERT, UPDATE, DELETE) debe actualizar todos los índices, multiplicando las operaciones de E/S. En el caso de las tablas con muchas escrituras, la eliminación de los índices redundantes puede mejorar el rendimiento entre un 20 y un 50%.

¿Debo eliminar todos los índices de una sola columna si tengo índices compuestos?

No siempre. Si el índice de una sola columna es muy selectivo y se consulta con frecuencia solo, consérvelo. Utilice las estadísticas de consulta de la base de datos para ver qué índices se utilizan realmente. Elimine los índices con un uso nulo o muy bajo. Las bases de datos modernas hacen un seguimiento del uso de los índices en las vistas del sistema.

Asegúrese gratis

Proteja el código, la nube y el tiempo de ejecución en un sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No requiere tarjeta de crédito | Escanea resultados en 32segs.