generell würde ich sagen:
Unter welchen Gesichtspunkten setze ich einen Index?
Wie schon gesagt wurde: auf Tabellen mit großen Datenmengen, bei denen die Geschwindigkeit des LESENs (also SELECT-Abfragen) optimiert sein soll.
Beispiel:
Tabellen welche Kunden, Produkte, Adressen, etc. beinhalten und Tabellen, welche als Bindeglieder zwischen 2 Tabellen für n:m-Beziehungen genutzt werden.
Besonders z.B. bei Produkt-Tabellen kommt es recht selten vor, dass geschrieben wird (nur, wenn neue Produkte eingepflegt werden) aber es wird häufig gelesen.
Bei Kundendaten ist das Verhältnis nicht ganz so extrem, aber trotzdem: bei JEDEM Seitenaufruf werden die Kunden-Daten eingelesen und nur jeder sonst-wieviel-hundertste-oder-tausendste Request ist 'ne Neuanmeldung...
Und wenn sich die Kunden/User z.B. mit 'ner Mail-Adresse oder 'nem Nickname einloggen, dann macht es durchaus Sinn, genau auf dieses Feld einen Index zu setzen
(da ja die Abfrage dann "SELECT * FROM customers WHERE username='foo' wäre)
Index über eine Spalte oder mehrere
je nachdem, wie die Daten später abgefragt werden.
- wenn immer die Kombination aus 2 Werten zu einem eindeutigen gewünschten Ergebnis führt, dann EINEN Index über diese BEIDEN Spalten
- wenn die Daten für sich alleine Sinn ergeben, dann einzelne Indizes
WELCHE Spalten sollten einen Index bekommen?
Alle Spalten, die regelmäßig für Abfragen benötigt werden.
Der PrimaryKey bekommt ja sowieso automatisch 'nen Index und außerdem machen dann sämtliche Spalten, die irgend eine ID darstellen und somit möglicherweise wiederum eine Beziehung zu Daten anderer Tabelle darstellen, Sinn, mit einem Index versehen zu werden.
Gerade wenn du über diese Felder dann JOINs ausführst, SOLLTE AUF JEDEN FALL ein Index auf diese Feldern liegen