Mysql-Belag vs composite vs Spalte index
In der folgenden Abfrage
SELECT col1,col2
FROM table1
WHERE col3='value1'
AND col4='value2'
Wenn ich 2 getrennte Indizes auf col3 und die andere auf col4, Die einer von Ihnen verwendet werden in dieser Abfrage ?
Ich habe irgendwo gelesen, dass für jede Tabelle in der Abfrage nur ein index verwendet wird. Bedeutet das, dass es keine Möglichkeit gibt, die Abfrage zu verwenden, beide Indizes ?
Zweitens, Wenn ich einen zusammengesetzten index über beide col3 und col4 zusammen, aber nur verwendet col3 in der WO Klausel, dass sein schlechter für die performance?
Beispiel:
SELECT col1,col2
FROM table1
WHERE col3='value1'
Schließlich, Ist es besser, einfach zu verwenden Abdeckung Indizes in allen Fällen ? und wie unterscheidet es sich zwischen MYISAM und innodb-Speicher-engines ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen abdeckenden index ist nicht das gleiche wie ein zusammengesetzter index.
Den index mit der höchsten Kardinalität.
MySQL speichert Statistiken, die auf dem index hat, was Eigenschaften.
Der index, der die anspruchsvollsten power (wie offensichtlich in der MySQL-Statistik) verwendet werden.
Können Sie eine Teilauswahl treffen.
Oder noch besser, verwenden Sie einen zusammengesetzten index, der beide enthält col3 und col4.
Zusammengesetzten index
Der richtige Begriff ist
compound
index, nicht composite.Nur die Links-die meisten Teil des zusammengesetzten index verwendet werden.
Wenn also der index ist definiert als
Finden Sie unter: http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
Beachten Sie, dass wenn Sie einen linken Bereich, die Sie bekommen können Weg mit nicht mit, dass ein Teil des index in die where-Klausel.
Man Stelle sich vor wir haben einen zusammengesetzten index
Der Grund, warum dies funktioniert, ist, dass die erste Abfrage verwendet das abdeckenden index und macht einen scan auf.
Die zweite Abfrage muss die Tabelle zuzugreifen und aus diesem Grund Scannen, obwohl der index nicht sinnvoll.
Dies funktioniert nur in InnoDB.
Was ist ein covering index
Einen abdeckenden index bezieht sich auf den Fall, wenn alle ausgewählten Felder in einer Abfrage sind
covered
durch einen index, in diesem Fall InnoDB (nicht MyISAM) nie Lesen werden die Daten in der Tabelle, sondern nur die Daten in der index um ein Vielfaches beschleunigt das auswählen.Beachten Sie, dass in InnoDB-der primary key ist enthalten in allen sekundären Indizes, also in einer Weise, die alle sekundären Indizes zusammengesetzte Indizes.
Dies bedeutet, dass wenn Sie führen Sie die folgende Abfrage auf InnoDB:
MySQL verwendet immer einen abdeckenden index und nicht auf die tatsächliche Tabelle.
select * from table1 where col2 = 200
wird nicht der index, aber bei mir lief der oben genannten tests,explain
zeigt, dass die Indizes tatsächlich verwendet werden. Welche Betriebssysteme Sie auf?Ich von Ihnen positiv bewertet werden Johan ' s Antwort für die Vollständigkeit, aber ich denke, dass die folgende Aussage, die er macht über sekundäre Indizes ist falsch und/oder verwirrend;
Ich Stimme zwar der Primärschlüssel ist ENTHALTEN im sekundären index, ich nicht einverstanden MySQL "wird immer mit einem abdeckenden index" in der SELECT-Abfrage angegeben hier.
Zu sehen, warum, beachten Sie, dass ein vollständiger index "scan" ist immer erforderlich in diesem Fall. Dies ist nicht das gleiche wie ein "seek" - Vorgang, sondern ist ein 100% - scan der sekundäre index-Inhalt. Dies ist aufgrund der Tatsache, dass die sekundäre index ist nicht bestellt durch die primäre Taste; es wird bestellt von "indexed_field" (sonst würde es nicht viel nützen, da ein index!).
Im Lichte dieser letzteren Tatsache, es wird Fälle geben, wo es effizienter ist, um "suchen" den Primärschlüssel, und extrahieren Sie dann indexed_field "von der eigentlichen Tabelle," nicht aus dem sekundären index.
pk = something
...Dies ist eine Frage, die ich viel hören, und es gibt eine Menge Verwirrung um die Probleme aufgrund von:
Die Unterschiede in mySQL über die Jahre.
Indizes und mehreren index-Unterstützung über die Jahre verändert (Richtung unterstützt wird)
InnoDB /myISAM-Unterschiede
Es gibt einige wichtige Unterschiede (unten), aber ich glaube nicht, dass mehrere Indizes einer von Ihnen
MyISAM ist älter, aber bewährt. Daten in MyISAM-Tabellen ist aufgeteilt zwischen drei unterschiedliche Dateien: - - Tisch-format -, Daten-und Indizes.
InnoDB ist ein relativ neuer ist als MyISAM, und ist die Transaktion sicher. InnoDB bietet auch row-locking im Gegensatz zu Tisch-Verriegelung erhöht die multi-user-Parallelität und Leistung. InnoDB hat auch foreign key-Einschränkungen.
Wegen seiner row-locking-Funktion InnoDB ist gut geeignet für high load Umgebungen.
Sicher sein über die Dinge, stellen Sie sicher, dass Sie explain_plan zu analysieren, die Ausführung der Abfrage.
Verbindung index ist nicht das gleiche wie ein composite index.
Das spart Platz und schafft somit weniger index-Seiten somit schneller I/O.
SELECT
. Ein "Composite" oder "Compound" - index mehr als eine Spalte in den index.