Wie kann ich feststellen, ob ein Index zum Sortieren in MySQL verwendet wird?

10

Ich habe eine Abfrage mit einer ORDER BY-Klausel, die eine Spalte verwendet, die die letzte Spalte eines Index ist, der in der WHERE-Klausel verwendet wird, im Wesentlichen in der folgenden Form:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

und der Index wird für Spalten (col_1, col_2, col_3, col_4) in dieser Reihenfolge erstellt.

Wenn ich die Abfrage profiliere, wird über 99% der Zeit im Status "Sortierergebnis" verbracht. col_4 ist eine Zeitstempelspalte, wenn dies einen Unterschied macht. Ich verstehe, dass ORDER BY nur unter bestimmten Umständen einen Index verwenden kann, aber ich bin immer noch ein bisschen verwirrt, wann genau der Optimierer dies tun würde.

Chris Cooper
quelle

Antworten:

13

Sie sollten EXPLAIN EXTENDEDvor der Abfrage anhängen und das Ergebnis selbst sehen.

Es sollte einen Eintrag für haben

  • mögliche_Tasten

Wenn diese Spalte NULL ist, gibt es keine relevanten Indizes. In diesem Fall können Sie möglicherweise die Leistung Ihrer Abfrage verbessern, indem Sie die WHERE-Klausel untersuchen, um zu überprüfen, ob sie sich auf eine Spalte oder Spalten bezieht, die für die Indizierung geeignet wären.

und

  • Schlüssel

Die Schlüsselspalte gibt den Schlüssel (Index) an, für den sich MySQL tatsächlich entschieden hat. Wenn MySQL beschließt, einen der möglichen_key-Indizes zum Nachschlagen von Zeilen zu verwenden, wird dieser Index als Schlüsselwert aufgeführt.

Weitere Informationen finden Sie unter Erläutern der Ausgabe und Erläutern von join_types

Mahesh Patil
quelle
Ich verstehe, meine Frage hat speziell mit der ORDER BY-Klausel zu tun. Meine Abfrage verwendet den angegebenen Index, um die zurückgegebenen Zeilen einzuschränken. Angesichts der Leistung der Sortierung wird sie jedoch vermutlich nicht für die ORDER BY-Klausel verwendet.
Chris Cooper
1
In einigen Fällen kann MySQL einen Index verwenden, um eine ORDER BY-Klausel zu erfüllen, ohne zusätzliche Sortierung vorzunehmen. Der Index kann auch verwendet werden, wenn ORDER BY nicht genau mit dem Index übereinstimmt, solange alle nicht verwendeten Teile des Index und alle zusätzlichen ORDER BY-Spalten Konstanten in der WHERE-Klausel sind. Die folgenden Abfragen verwenden den Index, um den ORDER BY-Teil aufzulösen. Siehe dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil
1

Sie verwenden EXPLAINfür Ihre Abfrage ( explain select-or-whatever-your-query-is).

possible_keysZeigen Sie diejenigen, die verwendet werden könnten, keydie tatsächlich verwendet werden.

sjas
quelle
1
Hinzu kommt: explain format=json select ...ist noch mächtiger. Es enthält used_key_partsInformationen darüber, ob ein zusammengesetzter Schlüssel teilweise oder vollständig verwendet wurde, und darüber index_condition, welcher Teil der Abfrage für welchen Index verantwortlich ist.
Okdewit