Hallo!
In einigen Fällen kann eine Anfrage so optimiert werden, dass Sie Werte abruft, ohne in der Daten-Datei nachzuschlagen. Wenn alle benutzten Spalten einer Tabelle numerisch sind und ein ganz links stehendes Präfix für einen Schlüssel ergeben, können die Werte mit größerer Geschwindigkeit aus dem Index-Baum abgerufen werden:
Ich finde es nicht mehr, aber ich könnte schwören das ich in der Doku irgendwo gelesen habe dass man auch indices über 2 Tabellen erstellen kann. Wobei - mysql erstellt pro Tabelle ein Verzeichis, wo sollte dann der Index gespeichert werden?
Wär' mir, ehrlich gesagt, neu - aber interessant. Ich frag' mich aber, was das nutzen soll? Seh' ich im Moment einfach nicht.
Hatte ich wohl was falsches im Kopf, naja.
Eine gute Lektüre über MySQL und Indizes:
http://www.mysql.com/doc/en/MySQL_indexes.html
Das habe ich schon mehrmals gelesen, aber so 100%ig schlau bin ich noch nicht.
Nein, MySQL nutzt soviele wie es für nötig hält.
Ich habe das zwar noch nie irgendwo wirklich eindeutig lesen können, aber Michael sagt da was anders.
- Index auf a.key und b.key
zumindest ein Index auf a.key ist klar. Wenn das denn so ist das nur ein Index pro Abfrage pro Tabelle genutzt wird. In der Doku steht z.b:
"Wenn es separate einspaltige Indexe auf spalte1 und spalte2 gibt, versucht der Optimierer, den restriktivsten Index zu finden, indem er entscheidet, welcher Index weniger Zeilen finden wird, und diesen Index dann benutzen, um Zeilen abzurufen."
d.h. wenn ich alles eigene Indices erstelle, dann wird höchtens einer benutzt, und zwar der restriktivste, also der über b.key.
Wird der Index auf b.key und a.key genutzt, um schnell die relevanten Zeilen zu finden, vermeidet eben die lineare Suche
klar!
- Index auf b.wert1 und b.wert2
Mir stellt sich eigentlich nur noch die Frage, ob ein Index auf Spalte b.key, oder (b.wert1,b.wert2) oder (b.key,b.wert1,b.wert2). Der zweite würde vermutlich auc nicht genutzt, ich würde mal auf den 3. Tippen.
Wie Du dort nachlesen kannst, verwendet MySQL einen ggf. vorhandenen Index, wenn MySQL dadurch weniger als 30% der Datensätze lesen muss.
ja, _einen_!
Wenn Du eine spezielle Abfrage optimieren willst, dann verwende EXPLAIN, um herauszufinden, wie MySQL an die Abfrage rangeht, anschließend kannst Du in der SELECT-Anweisung noch USE INDEX verwenden, um MySQL einen bestimmten Index anzuweisen, den es nutzen soll.
MySQL weiß besser als ich welcher Index der beste ist, also warum sollte ich das vorschreiben? Und wie verrät mir EXPLAIN wie MySQL da herangeht? Ich finde EXPLAIN bis auf die Information welcher Index tatsächlich verwendet wird wenig hilfreich.
Indizes gehören zum allgemeinen Datenbankentwurf, und nicht unbedingt zur Optimierung einer Abfrage.
Sehe ich anders. Der Index ist dazu da die Anfragen zu beschleunigen, sonst nichts. Der Datenbank-Entwurf hat mit den Indices erstmal nichts zu tun. Wenn ich meine Daten-Struktur habe kann ich Indices dazu einsetzen, die Anfragen zu beschleunigen, evtl sogar jede "teure" Abfrage einzelnd. Man kann ja in einer Tabelle mehrere Indices speziell für mehrere verschiedene Abfragen haben. Es wird halt bei jeder Abfrage dann immer der für die aktuelle Abfrage optimierte Index verwendet.
Ist es allerdings _die_ Abfrage, die 90% Deiner Datenbankaktionen ausmacht, dann lohnt es sich, die Datenbank in Hinblick auf diese Abfrage zu optimieren.
Das habe ich vor. Habe ich 3 verschiedene Abfragen die zusammen 90% der Abfragen ausmachen, dann kann ich auch 3 Verschiedene Indices erstrellen, für jedee der 3 den optimalen Index. Der Query-Optimizer sollte sich dann automatisch den jeweils günstigstens Index verwenden.
MySQL verwendet drei Schlüsselwörter, um Indizes anzulegen:
PRIMARY KEY - Primärschlüssel, ist auf jeden Fall eindeutig
UNIQUE - ein eindeutiger Index, d.h. jeder Wert darf nur einmal vorkommen
INDEX - Ein nicht eindeutiger Index
Ist mir bekannt ;-)
Dann nimm so viele Indizes wie möglich!
Was habe ich von vielen Indices wenn am Ende nur einer verwendet wird? Bei Mehrspaltigen wird es nur kritisch ob der Index überhaupt verwendet wird, aber das muß ich nochmal nachlesen, da kommt es näämlich auf die Reihenfolge der indizierten Spalten an!
Viele Grüße
Andreas