Het eerste waar u zich bewust van moet zijn, is dat MySQL slechts één index per psuedo-SELECT (niet-statement) gebruikt - wanneer u de uitvoer van de SELECT bekijkt met EXPLAIN, ziet u per welke index is gekozen. EXPLAIN kan alleen worden uitgevoerd op SELECTS, dus we moeten aannemen dat een DELETE/UPDATE hetzelfde plan gebruikt wanneer u de syntaxis verwisselt voor SELECT...
De meeste databases (ingesloten kunnen vreemd zijn) ondersteunen voor zover ik weet het gebruik van indexen in de volgende clausules:
- SELECTEER
- DOEN (ANSI-92-syntaxis)
- WAAR (omdat er zowel ANSI-89 en . zijn filtering hier)
- HAVING (WHERE equivalent, maar in tegenstelling tot WHERE - staat geaggregeerd gebruik toe zonder subquery nodig te hebben)
- BESTEL DOOR
Ik ben niet 100% op GROUP BY, dus ik laat het voorlopig achterwege.
Uiteindelijk is het de keuze van de optimalisatie voor wat te gebruiken op basis van het algoritme en de beschikbare statistieken. U kunt de ANALYSE TABLE-syntaxis gebruiken om de statistieken te vernieuwen (periodiek, niet constant alstublieft).
Aanvulling
MySQL beperkt ook de hoeveelheid ruimte die voor het toewijzen van indexen - 1.000 bytes voor MyISAM-tabellen en 767 bytes voor InnoDB-tabellen . Omdat MySQL slechts één index per psuedo-SELECT gebruikt, is het afdekken van indexen (indexen die meer dan één kolom bevatten) een goed idee, maar het komt er echt op aan de meest voorkomende zoekopdracht te testen en er zo goed mogelijk voor te optimaliseren. De indexeringsprioriteit moet zijn:
- Primaire sleutel (ergens in v5 werd het maken van indexen voor de pk automatisch)
- Buitenlandse sleutels (volgende meest waarschijnlijke JOIN-kandidaat
- Filtratiecriteria (ervan uitgaande dat je de ruimte hebt)