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.

War es hilfreich?

Lösung

  1. Nein, es ist nicht.
  2. 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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top