2010-04-26 9 views
7

Leí en MySQL Performance Blog que cuando las tablas son grandes, es mejor escanear tablas completas, en lugar de usar índices.¿Los índices son buenos o malos para una base de datos grande?

Tengo una tabla con decenas de millones de filas. Al realizar consultas, si no uso índices, las consultas son 24 veces más lentas que con los índices. Sé que muchas cosas pueden causar esto (por ejemplo, son filas almacenadas secuencialmente), pero ¿pueden darme algunas pistas de lo que podría estar pasando? ¿O cómo debería comenzar a examinar este tema? Quiero entender cuando se prefiere el uso de índices y cuando no es

Gracias

+1

¡Ni siquiera puede respirar sin índices! –

+0

Buen trabajo ejecutando pruebas de comparación en su propia base de datos. Cuando se trata de rendimiento, las pruebas siempre indican qué camino es más rápido. – phkahler

Respuesta

8

El artículo dice que cuando se trata de conjuntos de datos muy grandes, donde la cantidad de filas con las que debe trabajar se acerca al número de filas que hay en la tabla, usar un índice podría perjudicar el rendimiento.

En este caso, pasar por el índice perjudicará el rendimiento, siempre que necesite más datos que los que están presentes en el índice.

Para recorrer el índice, primero el motor de la base de datos tiene que leer grandes partes de la tabla de índice (es un tipo de tabla), luego para cada fila (o conjunto de filas) de este resultado, vaya al real mesa y comienza a tomar una cereza de las páginas para leer.

Si, por otro lado, solo necesita recuperar columnas de esa área que ya forma parte de la tabla de índice, entonces el motor de base de datos solo tiene que leer eso y no continuar a la tabla completa para obtener más datos.

Si termina leyendo más o cerca de la mayor parte de la tabla real en cuestión, todo el trabajo requerido para tratar con el índice podría ser más sobrecargado que solo hacer una exploración de tabla completa para comenzar.

Ahora, esto es todo el artículo está diciendo. Para la mayoría del trabajo relacionado con una base de datos, usar índices es lo correcto.

Por ejemplo, si necesita extraer un pequeño conjunto de filas, pasar por un índice en lugar de una exploración de tabla completa será mucho más rápido.

En cualquier caso, si tiene dudas, debe hacer un perfil de rendimiento para averiguar cómo se comporta su aplicación bajo diferentes tipos de cargas, y luego comenzar a ajustar, no tome un solo artículo como una bala de plata por nada.

Por ejemplo, una manera de acelerar las consultas de ejemplo que hace un recuento de la columna de la pad en el artículo, sería la creación de un único índice que cubría tanto val y pad, de esta manera, el recuento sería simplemente un escaneo de índice, y no un índice-escaneo + tabla-búsqueda, y se ejecutaría más rápido que el escaneo de tabla completo.

Su mejor opción es conocer sus datos, y para experimentar, y saber cómo las herramientas que utilizan el trabajo, por lo que de hecho, aprender más acerca de los índices, pero al final, es que quien decide qué es lo mejor para tu programa

+1

Como dice el artículo, "Incluso si observa el 1% o las filas o menos el escaneo completo de la tabla puede ser más rápido". Así que no es cojo, pero la respuesta parece ser "depende de la situación específica". –

+0

Sí, de hecho lo hace. –

1

es una buena práctica para poner el índice en cada columna que utilizaste en una cláusula DONDE .

2

Como siempre, depende. Hasta ahora, nunca me he encontrado con un escenario como se describe en las publicaciones del blog. Usar índices en mis consultas para grandes (más de 50 millones de filas) ha sido del orden de 100 a 10000 veces más rápido que hacer una exploración de tabla completa en estas tablas grandes.

Probablemente no haya ninguna bala de oro aquí, debe probar sus datos particulares y sus consultas particulares.

Cuestiones relacionadas