Ist es möglich, durch den Bereich auf ganz links Mehr Index auszuwählen?
-
30-09-2019 - |
Frage
Ich habe einen Index m_idx
auf (k1,k2,k3)
Wenn ich das tue
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
OR
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1 IN (500,1000,1500 ...) AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 999
Aber wenn ich versuche, einen Bereich auf k1 zu verwenden:
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1>=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 58035
In allen Fällen ERKLÄREN sagt, dass der Schlüssel verwendet wird, ist m_idx
Aber ich denke, dass im dritten Fall m_idx
ist es nicht verwendet (ich habe auch einen Index nur auf k1).
Ansonsten verstehe ich nicht, warum IT'IS mehr als 1000 Zeilen zu lesen.
Ich habe erwartet, um Scan m_idx
Index und ONLY the first 1000
Zeilen, die die Bedingungen erfüllen, um aus der Tabelle abgelesen werden.
Aber in der Tat glaube ich, dass für den dritten Fall scannt er den Index und die Zeilen, die aufeinander treffen k1 Zustand aus dem tb gelesen und k2 und k3 Bedingungen geprüft werden, nachdem die Zeilen aus tb gelesen werden.
Ich benutze: MySql mit MyISAM, WINDOWS 7 64, die tb hat 1 mil Reihen;
Also meine Fragen sind:
Ist es möglich, durch den Bereich auf ganz links Mehr Index auszuwählen?
OR
Ich mache etwas anderes falsch?
Vielen Dank.
Lösung
- Nein, es ist nicht.
- Nein, Sie tun alles richtig
http://dev.mysql.com/doc/ refman / 5.1 / de / Entfernungs-optimization.html ( "7.3.1.3.2. Die Bereichszugriffsmethode für mehrteilige Indizes" Teil)
So können Sie nicht helfen Optimierer kann diese Abfrage schneller auszuführen.
Und vermeiden, mit FORCE INDEX
, da Optimierer weiß besser, was Index zu verwenden.
Auch:
k1>=500 AND k2 IN(...) AND k2>2000
In Abhängigkeit von dem Teil zurückkehrt weniger Datensätze, entweder k1>=500
oder k2 IN(...) AND k2>2000
(Ich bin nicht sicher, warum brauchen Sie hier > 2000
wegen Sie es manuell vergleichen, bevor Add zu IN()
), können Sie auch versuchen Index k2
zu erstellen (wenn k2
Partners wieder eine geringere Menge an Datensätzen).