Moin!
Auf a und b einen zu setzen, bietet sich bei der genannten Query wahrscheinlich an.
Dachte ich auch uns habe:
CREATE INDEX ab ON meineTabelle (a, b);
Du fragst die Spalten einzeln ab, also solltest du auch auf jede einzeln einen Index setzen, nicht auf beide zusammen.
Nein, das bringt nichts. MySQL nutzt nur genau einen Index pro Tabelle - und der Optimizer wählt unter den verfügbaren Indices einen "geeigneten" aus. Das ist im Idealfall der Index, der am stärksten die Datenmenge einschränkt.
Wenn du also zwei Indices auf die Spalten a und b erzeugst, wird in einer Abfrage, die die Spalten a UND b benutzt, nur einer der beiden Indices benutzt, und damit Potential verschenkt - insbesondere wenn diese beiden Indices für sich genommen nicht sonderlich gut einschränken.
Ein kombinierter Index hängt die mehreren Spalten (hier also a und b) in der gewünschten Reihenfolge aneinander und greift immer, wenn der Optimizer erkennt, dass 1) alle Spalten des Index abgefragt werden, oder 2) alle Spalten von der ersten Indexspalte aufsteigend abgefragt werden.
Wenn es also aufgrund der Gesamtmenge an Querys sinnvoll ist, auf beide Spalten einen Index zu setzen, und zusätzlich auch auf die Kombination beider Spalten, dann würde man 1) einen Index auf die Kombination von Spalte a und b setzen (das wird dann für Querys auf a allein sowie auf a + b genutzt), sowie zusätzlich noch auf Spalte b allein.
Allerdings hilft ein Index nur bedingt. Wenn die abgefragte Datenmenge so groß ist, dass auch nach der Konsultation des Index das Ergebnis nicht in den RAM passen würde, muss MySQL trotzdem auf der Festplatte in eine temporäre Tabelle kopieren. Das kostet extrem viel Zeit.
- Sven Rautenberg