Aikido

¿Por qué evitar índices de base de datos redundantes: optimizando 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 múltiples índices cubren las mismas columnas o cuando un índice es un 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 en columnas similares sufre la penalización de rendimiento de escritura cinco veces, mientras que un solo índice sería suficiente para la optimización de 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 los datos cambian. Los índices redundantes multiplican este coste sin proporcionar beneficios en las consultas. Una tabla con tres índices redundantes en user_id triplica la sobrecarga de escritura mientras que solo se utiliza un índice.

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

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

Ejemplos de código

❌ 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é es incorrecto: El índice en el correo electrónico es redundante porque idx_users_email_status comienza con Correo electrónico y puede manejar consultas filtrando solo por correo electrónico. De manera similar, idx_users_created es redundante con idx_users_created_status. Cada inserción o actualización en esta tabla actualiza cuatro índices cuando dos serían suficientes.

✅ 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é esto importa? Dos índices compuestos sirven para todos los patrones de consulta mientras eliminan la redundancia. Consultas que filtran por Correo electrónico solo utilizan el primer índice, y las consultas que filtran por created_at solo utilizan el segundo. El rendimiento de escritura mejora porque solo dos índices necesitan actualizaciones en lugar de cuatro.

Conclusión

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

Preguntas frecuentes

¿Tiene preguntas?

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

Consulta las tablas del sistema de tu base de datos para listar todos los índices. Para PostgreSQL, utiliza la vista pg_indexes. Para MySQL, utiliza SHOW INDEX FROM table_name. Busca índices donde uno sea prefijo de otro (email vs email+status) o donde múltiples índices cubran las mismas columnas en diferentes órdenes.

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

Cuando la selectividad de la consulta importa. Si consulta con frecuencia solo la segunda columna de un índice compuesto, esa consulta no puede usar el índice de manera eficiente. Un índice en (status, email) no ayudará a las consultas que filtren solo por email. Sin embargo, un índice en (email, status) puede servir a consultas solo por email.

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

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

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

No siempre. Si el índice de una sola columna es altamente selectivo y se consulta con frecuencia de forma aislada, consérvalo. Utiliza las estadísticas de consultas de la base de datos para ver qué índices se usan realmente. Elimina los índices con uso nulo o muy bajo. Las bases de datos modernas rastrean el uso de índices en las vistas del sistema.

Asegúrate ahora.

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

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.