Verwendung des Index für die innere Join-Tabelle in MySQL

8

Ich habe Tabelle Foo mit 200 Millionen Datensätzen und Tabelle Bar mit 1000 Datensätzen, sie sind viele-zu-eins verbunden. Es gibt Indizes für die Spalten Foo.someTime und Bar.someField. Auch in Bar 900 haben Datensätze einenField von 1, 100 einenField von 2.

(1) Diese Abfrage wird sofort ausgeführt:

%Vor%

(2) Dieser dauert nur für immer (die einzige Änderung ist b.someField = 2):

%Vor%

(3) Aber wenn ich where-Klausel auf someTime abbringe, wird sie auch sofort ausgeführt:

%Vor%

(4) Auch ich kann es beschleunigen, indem ich die Indexverwendung erzwinge:

%Vor%

Hier ist die Erklärung zu Abfrage (2) (die ewig dauert)

%Vor%

Hier ist das Erklären auf (4) (welches einen Kraftindex hat)

%Vor%

Die Frage ist also, wie man MySQL beibringt, den richtigen Index zu verwenden? Die Abfrage wird von ORM generiert und ist nicht nur auf diese beiden Felder beschränkt. Und es wäre auch schön, die Abfrage nicht viel zu ändern (obwohl ich mir nicht sicher bin, ob der innere Join hier passt).

UPDATE:

%Vor%

Danach wird die Abfrage (2) in 0.00 Sekunden ausgeführt.

    
Yurii Shylov 13.06.2013, 09:18
quelle

1 Antwort

4

Wenn Sie einen zusammengesetzten Index für foo(table_id, sometime) erstellen, sollte das sehr hilfreich sein. Dies liegt daran, dass der Server die Ergebnismenge um table_id zuerst und dann um sometime eingrenzen kann.

Beachten Sie, dass der Server bei Verwendung von LIMIT nicht garantiert, welche Zeilen abgerufen werden, wenn sich viele für Ihre WHERE-Einschränkung qualifizieren. Technisch kann jede Ausführung ein leicht unterschiedliches Ergebnis liefern. Wenn Sie Mehrdeutigkeiten vermeiden möchten, sollten Sie immer ORDER BY verwenden, wenn Sie LIMIT verwenden. Dies bedeutet jedoch auch, dass Sie bei der Erstellung geeigneter Indizes vorsichtiger vorgehen sollten.

    
mvp 13.06.2013, 09:30
quelle