@Pierre 303 ya lo dijo, pero lo diré nuevamente. SÍ use índices en combinaciones de columnas. Un índice combinado activado (a, b)
es solo un poco más lento para las consultas a
que un índice activado a
solo, y es enormemente mejor si su consulta combina ambas columnas. Algunas bases de datos pueden unir índices en a
y b
antes de llegar a la tabla, pero esto no es tan bueno como tener un índice combinado. Cuando crea un índice combinado, debe colocar la columna que es más probable que se busque primero en el índice combinado.
Si ésta lo admite, DO puso índices en las funciones que se muestran en las consultas en lugar de columnas. (Si está llamando a una función en una columna, los índices en esa columna son inútiles).
Si está utilizando una base de datos con las verdaderas tablas temporales que se pueden crear y destruir al vuelo (por ejemplo, PostgreSQL, MySQL, pero no Oracle), entonces NO crear índices en tablas temporales.
Si está utilizando una base de datos que le permite (por ejemplo Oracle), DO bloqueo en buenos planes de consulta. Los optimizadores de consultas a lo largo del tiempo cambiarán los planes de consulta. Suelen mejorar el plan. Pero a veces lo hacen dramáticamente peor. En general, no notará mejoras en el plan: la consulta no fue un cuello de botella. Pero un solo mal plan puede derribar un sitio ocupado.
NO tenga índices en las tablas en las que va a realizar una gran carga de datos. Es mucho, mucho más rápido soltar índices, cargar los datos y luego reconstruir los índices que mantenerlos a medida que carga la tabla.
NO use índices en consultas que tengan que acceder a más de una pequeña fracción de una tabla grande. (Lo pequeño depende del hardware. El 5% es una regla práctica decente). Por ejemplo, si tiene datos con nombres y género, los nombres son un buen candidato para la indexación, ya que cualquier nombre representa una pequeña fracción del total de filas. No sería útil indexar por género, ya que aún tendrá que acceder al 50% de las filas. Realmente desea utilizar un escaneo de tabla completo La razón es que los índices terminan accediendo a un archivo grande al azar, lo que hace que necesite búsquedas de disco. Las búsquedas de disco son lentas. Como ejemplo, recientemente logré acelerar una consulta de una hora que se veía así:
SELECT small_table.id, SUM(big_table.some_value)
FROM small_table
JOIN big_table
ON big_table.small_table_id = small_table.id
GROUP BY small_table.id
a menos de 3 minutos reescribiéndolo de la siguiente manera:
SELECT small_table.id, big_table_summary.summed_value
FROM small_table
JOIN (
SELECT small_table_id, SUM(some_value) as summed_value
FROM big_table
GROUP BY small_table_id
) big_table_summary
ON big_table_summary.small_table_id = small_table.id
lo que obligó a la base de datos a comprender que no debería intentar usar el índice tentador big_table.small_table_id
. (Una buena base de datos, como Oracle, debería resolverlo por sí sola. Esta consulta se estaba ejecutando en MySQL).
Actualización: Aquí hay una explicación del punto de búsqueda de disco que hice. Un índice proporciona una búsqueda rápida para indicar dónde están los datos en la tabla. Esto suele ser una victoria, ya que solo verá los datos que necesita ver. Pero no siempre, particularmente si eventualmente analizará muchos datos. Los discos transmiten bien los datos, pero hacen que las búsquedas sean lentas. Una búsqueda aleatoria de datos en el disco toma 1/200 de segundo. La versión lenta de la consulta terminó haciendo algo así como 600,000 de esos y tomó cerca de una hora. (Hizo más búsquedas que eso, pero el almacenamiento en caché captó algunas de ellas). Por el contrario, la versión rápida sabía que tenía que leer todo y transmitir datos a algo así como 70 MB / segundo. Pasó por una tabla de 11 GB en menos de 3 minutos.