2011-03-26 21 views
65

Recientemente he aprendido la maravilla de los índices, y el rendimiento ha mejorado drásticamente. Sin embargo, con todo lo que he aprendido, parece que no puedo encontrar la respuesta a esta pregunta.MySQL: ¿por qué no indexar todos los campos?

Los índices son geniales, pero ¿por qué alguien no podía simplemente indexar todos los campos para hacer que la tabla fuera increíblemente rápida? Estoy seguro de que hay una buena razón para no hacer esto, pero ¿qué hay de tres campos en una mesa de treinta campos? 10 en un campo de 30? ¿Dónde debería uno trazar la línea, y por qué?

+5

intente insertar un valor en una tabla con más de 10k entradas indexadas, todas las entradas deben actualizarse debido a inserts/delete y esta es una gran sobrecarga de tiempo y algo de una sobrecarga de memoria si cada valor tiene un índice –

+3

. Hay una razón más aparte del espacio y el rendimiento de escritura: usar [múltiples índices para una sola tabla es muy ineficiente] (http: //use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-combine-performance). Eso significa que, incluso si tiene un índice en cada columna, el rendimiento de selección no es muy bueno si se accede a múltiples columnas en la cláusula WHERE. En ese caso, un índice de varias columnas es el mejor. –

Respuesta

75

Los índices ocupan espacio en la memoria (RAM); Demasiados o demasiado grandes índices y el DB va a tener que estar intercambiándolos desde y hacia el disco. También aumentan el tiempo de inserción y eliminación (cada índice debe actualizarse para cada dato insertado/eliminado/actualizado).

No tiene memoria infinita. Haciéndolo para que todos los índices quepan en RAM = bueno.

No tiene tiempo infinito. Indexar solo las columnas que necesita indexar minimiza el impacto de inserción/eliminación/actualización de rendimiento.

+0

Buena respuesta casual para dar una comprensión general, pero no ayuda mucho a la hora de determinar dónde trazar la línea en los índices. ¿Cómo puedes saber? Simplemente agréguelos a campos comúnmente WHERED y espere lo mejor. – Andrew

5

Tiene que equilibrar las necesidades de CRUD. Escribir en tablas se vuelve lento. En cuanto a dónde dibujar la línea, eso depende de cómo se estén procesando los datos (clasificación del filtrado, etc.).

+0

y también cada índice toma un poco del espacio de la base de datos – Acanthus

+0

@Acanthus: los discos duros más pequeños disponibles se miden en ** gigabytes **. –

+2

@OMG pero no RAM como señala Brian. es ** nunca ** una buena idea almacenar más de lo que necesita. el almacenamiento en memoria caché de datos/índice en la RAM, los medios de copia de seguridad (versiones que se ajustarán por cinta, etc.) se ven afectados por índices inútiles – RichardTheKiwi

14

Tenga en cuenta que cada índice se debe actualizar cada vez que se actualiza, inserta o elimina una fila. Por lo tanto, cuantos más índices tenga, menor será el rendimiento que tendrá para las operaciones de escritura.

Además, cada índice ocupa más espacio en disco y memoria (cuando se llama), por lo que también podría ralentizar las operaciones de lectura (para tablas grandes). Check this out

+4

El enlace es para * MS SQL Server *; esta pregunta es para ** MySQL ** –

+2

@OMG la mayoría de los puntos en el enlace se aplica a todos los RDBMS principales – RichardTheKiwi

+1

@Richard aka cyberkiwi: Los índices no están cubiertos por ANSI; es un milagro que cada proveedor haya usado una terminología similar. Pero incluso entonces, solo SQL Server y MySQL usan el índice de terminología "agrupado" y "no agrupado", significa más en SQL Server que en MySQL. No hay nada que garantice que las recomendaciones para un proveedor se apliquen a otro. –

0

La indexación ocupará más espacio asignado tanto del disco como del RAM, pero también mejorará mucho el rendimiento. Lamentablemente, cuando alcanza el límite de memoria, el sistema cederá el espacio del disco y pondrá en riesgo el rendimiento. Prácticamente, no debe indexar ningún campo que pueda pensar que no involucra ningún tipo de algoritmo de cruce de datos, ni insertar ni buscar (cláusula WHERE). Pero deberías, si no es así. Por defecto, debes indexar todos los campos. Los campos que debe considerar desagregar es si las consultas solo las usa el moderador, a menos que también necesiten velocidad.

Cuestiones relacionadas