Hallo David,
beim Indizieren gibt es viele Regeln, für die man ein wenig Gefühl benötigt. Allgemein werden Indexe dafür eingesetzt, daß etwas schneller gefunden wird!
Es macht kein Sinn, Felder zu indizieren, nach denen NICHT gesucht wird! Je mehr Indizies angelegt wurden, um so mehr wird „geschrieben“, wenn ein oder viele Records in die Tabelle eingefügt werden. Also jeder Index muß dann zusätzlich verändert werden!
Kleine Tabellen indiziert man nicht, wenn diese nicht extrem anwachsen! Die Anzahl der Records können dabei 100 oder 10000 sein, je nach Breite der Tabelle, also abhängig von der Anzahl der Spalten und Spaltenbreite!
Kommen wir zu Ihrem Beispiel zurück:
Sie haben eine WHERE-Anweisung und suchen nach location_code, also sollte location_code indiziert sein! Der SQL-Parser wird also zuerst die Menge an Datensätzen eingrenzen, die aufgrund der Where-Anweisung, gefiltert werden.
Als Nächstes, führen Sie eine Sortierung durch, wobei der Parser, die vorher gefilterte Menge durchsuchen und ordnen muß. Auch hier hilft ein zusätzlicher Index auf language!
Einen Index auf locations zu setzen, macht hier kein Sinn, weil dieses Feld zum Suchen oder Sortieren nicht verwendet wird. Sollte dies natürlich in einem weiteren Script erfolgen und es darauf nicht nur seltene Einzelabfragen geben, kann man natürlich auch dieses Feld indizieren.
Wenn eine Tabelle statisch ist und nicht oft verwendet wird, kann die natürlich viele Indizies enthalten, weil kein „schreiben“ erfolgt. Eine Tabelle, die oft verwendet wird, sollte wirklich nur dort indiziert werden, wo es nötig ist.
Ist die Tabelle zu klein oder erfolgen die Such- bzw. Sortierabfragen in Verbindung mit für den Parser nicht auflösbaren Formeln, wird der Index unter Umständen nicht verwendet!
Hier sollte man SQL-Abfragen mit EXPLAIN prüfen und die Ausführungspläne verstehen lernen. Dabei sind eine höhere Anzahl von Schritten, die der Parser durchführen muß, teilweise dennoc schneller, als wenn dies in einem Schritt durchgefürt wird. Beim Auflösen der Abfrage, werden unter Umständen in Bruchteilen einer Sekunde, kleine Zwischentabellen im Speicher angelegt und diese Tabellen mit einander verknüpft. Nur beim Ausgeben, erfolgt dann der Abruf aller anderen Daten aus der Tabelle.
Beachten Sie, daß Schreiben immer länger dauert, als lesen! Alles, was im Speicher (RAM) bearbeitet werden kann, ist viel schneller, als Zugriffe auf die Platte (so lange diese noch magnetisch sind - es kommen ja inzwischen neue SSD-Platten auf Basis Flash Memory, die fast so schnell, wie RAM-Speicher sind - nur halt noch sehr teuer und klein sind)
Ach so, Sie können die Indizierung (also Index neu anlegen - oder löschen), jederzeit ändern und dann werden die Indexes über den ALTER - Befehl direkt angelegt (für alle Sätze in der Tabelle) oder gelöscht.
Viel Spaß weiterhin mit MySQL
1awww.com - Internet-Service-Provider
Detlef Bracker
Ich habe deshalb versucht herauszufinden, wie ich meine MySQL
performance erhöhen kann und festgestellt, dass ich wohl
indizes hätte vergeben sollen.