Das man gerade für größere Tabellen in der Datenbank möglichst Indizes setzen sollte, um Datensätze schneller zu finden und somit die Abfragezeit zu reduzieren dürfte den meisten Entwicklern bekannt sein. Weniger bekannt ist jedoch, dass bei einer Abfrage je Tabelle immer nur ein einziger Index verwendet wird.

Wenn es mehrere Indizes für eine Tabelle gibt versucht MySQL den besten zu bestimmen, kann damit aber auch überfordert sein. Um zu prüfen, welcher Index für die Abfrage genutzt wird kann man sich durch ein vorangestelltes EXPLAIN Informationen zu der Abfrage anzeigen lassen.

EXPLAIN SELECT * FROM tabelle WHERE feldA="Ja" OR feldB="Nein"

MySQL gibt dann in dem Feld possible_keys die Indizes an, die für die Abfrage in Frage kommen und in dem Feld key den Index, den MySQL aktuell für die Abfrage verwenden würde. Es kann natürlich auch sein, dass key NULL ist, was meist ein Zeichen dafür ist, dass die möglichen Indizes die Ergebnismenge nicht weit genug einschränken und es dann nach Meinung von MySQL schneller geht einfach nur den gesamten Datenbestand zu durchsuchen.

Da man als Entwickler meist (wenn auch nicht immer) eine recht genau Vorstellung davon hat, wie die Tabelle aufgebaut ist und welche Daten sie enthält, kann es natürlich sein, dass man weiß (oder es testen möchte), dass ein anderer Index besser funktioniert. MySQL stellt dazu die Hints USE, IGNORE und FORCE INDEX bereit. Mit USE kann man eine Liste der possible_keys angeben, IGNORE schließt Indizes explizit aus und FORCE zwingt MySQL dazu für die Abfrage den angegebenen Index zu verwenden.

Im folgenden Beispiel würde MySQL also gezwungen den IndexC zu benutzen, egal was es sonst selbt ermitteln würde.

EXPLAIN SELECT * FROM tabelle FORCE INDEX( IndexC ) WHERE feldA="Ja" OR feldB="Nein"