2016-04-08 18 views
0

Die Idee besteht darin, schnelle Abfragen basierend auf den Spalten c1, c2 und c3 durchzuführen.MySQL - Eindeutiger Index für mehrere Spalten

Es gibt 3 Arten von Anfragen:

SELECT COUNT(*) FROM tbl WHERE c1=... AND c2=... 
SELECT c2, c3 FROM tbl WHERE c1=... 
SELECT DISTINCT c2 FROM tbl WHERE c1=... AND c3=... 

Was ist der beste Weg Index zu bauen, wenn ich will lassen (c1, c2) eindeutig sein?

Ich denke an einen einzigen Index wie folgt aus:

UNIQUE INDEX idx_c1_c2 (c1, c2) 

Aber die dritte Abfrage würde nicht diesen Index werden.

Irgendwelche Vorschläge?

+0

Bitte zeigen Sie auch die WHERE-Klausel für die 3 Abfrage abgeschlossen .. weil die WHERE-Klausel die primäre indexi Auswertung – scaisEdge

+0

Dritte Abfrage _WILL_ verwenden den Index Scannen für 'C1 Spalte. Dann scannt es die Tabelle, um den "c3" -Zustand zu erfüllen. –

+0

@scaisEdge Die '...' 's sind nur Literale. – WoLfPwNeR

Antwort

0

WHERE c1= AND c2= benötigt INDEX(c1, c2) in beliebiger Reihenfolge. Wenn dieses Paar "einzigartig" ist, dann machen Sie es UNIQUE statt INDEX. Oder überlegen Sie, ob es das PRIMARY KEY ist (das ist auch UNIQUE und ein INDEX).

WHERE c1= wird gerne jede Art von Index beginnend mit c1 verwenden.

WHERE c1= AND c3= würde nur die c1 Teil von (c1, c2), die etwas nützlich wäre. Besser wäre es, einen weiteren Index hinzuzufügen: INDEX(c1, c3) in beliebiger Reihenfolge. Schlagen Sie (c3, c1) vor, um etwas Abwechslung zu erhalten.

Kein einzelner Index funktioniert "gut" für alle drei Abfragen.

Suchen nach PRIMARY KEY ist in der Regel schneller als von UNIQUE INDEX, wenn die Tabelle Engine=InnoDB ist. Wenn Sie jetzt eine AUTO_INCREMENT als PRIMARY KEY haben, überlegen Sie, ob es sich lohnt, zu behalten, gegen das Ersetzen durch das "natürliche" (c1, c2).

Verwandte Themen