Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abdeckung vs. zusammengesetzter vs. Spaltenindex

Ein abdeckender Index ist nicht dasselbe wie ein zusammengesetzter Index.

Wenn ich 2 separate Indizes habe, einen auf col3 und den anderen auf col4, welcher davon wird in dieser Abfrage verwendet?

Der Index mit der höchsten Kardinalität.
MySQL führt Statistiken darüber, welcher Index welche Eigenschaften hat.
Der Index mit der größten Unterscheidungskraft (wie in den Statistiken von MySQL ersichtlich) wird verwendet.

Ich habe irgendwo gelesen, dass für jede Tabelle in der Abfrage nur ein Index verwendet wird. Bedeutet das, dass es für die Abfrage keine Möglichkeit gibt, beide Indizes zu verwenden?

Sie können eine Unterauswahl verwenden.
Oder noch besser einen zusammengesetzten Index verwenden, der sowohl col3 als auch col4 enthält.

Zweitens, wenn ich einen zusammengesetzten Index mit col3 und col4 zusammen erstellt habe, aber nur col3 in der WHERE-Klausel verwendet habe, wäre das für die Leistung schlechter? Beispiel:

Zusammengesetzter Index
Der korrekte Begriff ist compound index, nicht zusammengesetzt.
Nur ganz links ein Teil des zusammengesetzten Index wird verwendet.
Also wenn der Index als

definiert ist
index myindex (col3, col4)  <<-- will work with your example.
index myindex (col4, col3)  <<-- will not work. 

Siehe:http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html

Beachten Sie, dass Sie, wenn Sie ein Feld ganz links auswählen, diesen Teil des Index in Ihrer where-Klausel nicht verwenden können.
Stellen Sie sich vor, wir hätten einen zusammengesetzten Index

Myindex(col1,col2)

SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  

Der Grund dafür ist, dass die erste Abfrage den abdeckenden Index verwendet und diesen durchsucht.
Die zweite Abfrage muss auf die Tabelle zugreifen und aus diesem Grund macht das Durchsuchen des Index keinen Sinn.
Das funktioniert nur in InnoDB.

Was ist ein abdeckender Index
Ein abdeckender Index bezieht sich auf den Fall, wenn alle in einer Abfrage ausgewählten Felder covered sind durch einen Index, in diesem Fall wird InnoDB (nicht MyISAM) niemals die Daten in der Tabelle lesen, sondern nur die Daten im Index verwenden, was die Auswahl erheblich beschleunigt.
Beachten Sie, dass in InnoDB der Primärschlüssel enthalten ist alle Sekundärindizes, also sind alle Sekundärindizes in gewisser Weise zusammengesetzte Indizes.
Das bedeutet, wenn Sie die folgende Abfrage auf InnoDB ausführen:

SELECT indexed_field FROM table1 WHERE pk = something

MySQL verwendet immer einen abdeckenden Index und greift nicht auf die eigentliche Tabelle zu. Obwohl es einen abdeckenden Index verwenden könnte, wird es den PRIMARY KEY bevorzugen weil es nur eine einzige Zeile treffen muss.