En términos generales:
1. No agregue un índice a menos que realmente lo necesite.
Cada índice hace que las escrituras sean más lentas...
2. Se utilizará un índice en las cláusulas where:
-- index on foo (bar)
select bar from foo where bar = :bar;
Del mismo modo, se usará en referencias de clave externa (en ambas tablas).
-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar));
3. Se usará un índice para clasificar, especialmente cuando esté vinculado a un límite:
-- index on foo (bar)
select bar from foo order by bar limit 10;
4. Los índices de varias columnas son ocasionalmente útiles cuando 2. y 3. se aplican ambos.
En este caso, coloque las condiciones where primero y la clave de clasificación al final:
-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;
5. Mantén las estadísticas de tu mesa actualizadas.
Si las estadísticas de la tabla son basura, hay pocas posibilidades de que el optimizador use sus índices. Aspire/analice manualmente su base de datos si es necesario.
6. El uso del índice depende de la partición de su tabla.
Más allá de un determinado umbral de filas recuperadas, será más rápido realizar un análisis completo de la tabla. Si su índice está en un campo booleano que más o menos divide su tabla en dos, nunca se usará.
Del mismo modo, si sus datos se almacenan de tal manera que la exploración del índice probablemente terminará accediendo aleatoriamente a casi todas las páginas de disco correspondientes a esa tabla, el planificador preferirá una exploración de la tabla completa.
7. Considere índices parciales/de expresión cuando estén disponibles.
Si tiene un campo que tiene el mismo valor excepto el 10% de sus filas, considere un índice parcial en él (es decir, donde no ese valor). Esto da como resultado un índice mucho más pequeño sin obstaculizar su utilidad real.
Si consulta constantemente una expresión aplicada a su columna y su plataforma ofrece índices de expresión, considere agregarle un índice. Cuando se usa, la expresión no se evaluará para cada fila.