Generellt sett:
1. Lägg inte till ett index om du inte verkligen behöver det.
Varje index gör skrivningar långsammare...
2. Ett index kommer att användas på where-satser:
-- index on foo (bar)
select bar from foo where bar = :bar;
På samma sätt kommer den att användas i främmande nyckelreferenser (på båda tabellerna).
-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar));
3. Ett index kommer att användas för sortering, särskilt när det är bundet till en gräns:
-- index on foo (bar)
select bar from foo order by bar limit 10;
4. Index med flera kolumner är ibland användbara när 2. och 3. båda gäller.
I det här fallet sätter du where-villkoren först och sorteringsnyckeln sist:
-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;
5. Håll din tabellstatistik uppdaterad.
Om tabellstatistiken är skräp, finns det små chanser att optimeraren kommer att använda dina index. Dammsug/analysera din databas manuellt om det behövs.
6. Indexanvändning beror på din tabellompartition.
Efter en viss tröskel för rader som hämtats går det snabbare att göra en fullständig tabellskanning. Om ditt index är på ett booleskt fält som mer eller mindre delar ditt bord i två delar, kommer det aldrig att användas.
På samma sätt, om dina data lagras på ett sådant sätt att indexsökningen sannolikt kommer att slumpmässigt komma åt nästan alltid tillämplig disksida för den tabellen, kommer planeraren att föredra en fullständig tabellsökning.
7. Överväg partiella/uttrycksindex när de är tillgängliga.
Om du har ett fält som har samma värde förutom 10 % av dina rader, överväg ett partiellt index på det (dvs. var inte det värdet). Detta resulterar i ett mycket mindre index utan att hindra dess faktiska användbarhet.
Om du ständigt frågar efter ett uttryck som tillämpas på din kolumn och din plattform erbjuder uttrycksindex, överväg att lägga till ett index på det. När det används kommer uttrycket inte att utvärderas för varje rad.