Reihenfolge nach Spalte sollte Index haben oder nicht?

35

Ich habe der Tabelle Indizes hinzugefügt, die für das Suchergebnis verwendet werden. Ich zeige Ergebnisse nach ASC- oder DESC-Reihenfolge. Diese Spalte sollte also einen Index haben oder nicht? Ich habe 2 weitere Indizes auf dieser Tabelle. Wie wirkt sich die Leistung aus, wenn für diese Spalte ein Index erstellt oder nicht erstellt wird?

Somnath Muluk
quelle
2
Bitte posten Sie die Abfrage
RolandoMySQLDBA 20.01.12

Antworten:

26

Ja, MySQL kann (unter bestimmten Bedingungen) einen Index für die Spalten in ORDER BY verwenden. MySQL kann jedoch keinen Index für gemischte ASC- und DESC-Reihenfolge von ( SELECT * FROM foo ORDER BY bar ASC, pants DESC) verwenden. Wenn Sie Ihre Abfrage und die Anweisung CREATE TABLE freigeben, können wir Ihre Frage genauer beantworten.

Hinweise zur Optimierung von ORDER BY-Klauseln finden Sie unter http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

Bearbeiten 2012-01-21 08:53

Es gab Fragen zur Quelle meiner Aussage über die Verwendung eines Index mit gemischtem ASC / DESC im ORDER BY. Aus der Dokumentation zur ORDER BY-Optimierung :

In einigen Fällen kann MySQL keine Indizes zum Auflösen von ORDER BY verwenden, obwohl es weiterhin Indizes verwendet, um die Zeilen zu finden, die mit der WHERE-Klausel übereinstimmen. Diese Fälle umfassen Folgendes:

...

Sie mischen ASC und DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

...

Außerdem ist das DESC-Schlüsselwort in CREATE INDEX bedeutungslos

Eine index_col_name-Angabe kann mit ASC oder DESC enden. Diese Schlüsselwörter sind für zukünftige Erweiterungen zum Angeben des Speichers für aufsteigende oder absteigende Indexwerte zulässig. Derzeit werden sie analysiert, aber ignoriert. Indexwerte werden immer in aufsteigender Reihenfolge gespeichert.

Aaron Brown
quelle
3
Msgstr "MySQL kann keinen Index für gemischtes ASC, DESC verwenden" . Referenz dafür?
ypercubeᵀᴹ
CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);sollte arbeiten.
Frank Heikens
Meine Quelle ist die in meiner Antwort verlinkte MySQL-Dokumentation. Suche nach "mix".
Aaron Brown
3
MySQL analysiert asc & Desc in CREATE INDEX, ignoriert sie jedoch. Indizes werden immer in aufsteigender Reihenfolge gespeichert. dev.mysql.com/doc/refman/5.5/en/create-index.html
Aaron Brown
1
Neu mit MySQL 8.0 : Jetzt kann es eine Mischung aus verwenden ASCund DESC wenn das INDEXdie gleichen Mischung.
Rick James
4

Für alle, die sich über die Antwort im Zusammenhang mit PostgreSQL wundern, lautet die Antwort: Ja, es wird ein Index verwendet. Gemäß der PostgreSQL-Dokumentation wird der Abfrageplaner "in Betracht ziehen, eine ORDER BY-Spezifikation zu erfüllen, indem er entweder einen verfügbaren Index durchsucht, der der Spezifikation entspricht, oder indem er die Tabelle in physischer Reihenfolge durchsucht und eine explizite Sortierung vornimmt". Dies bedeutet, dass der Planer einen Index verwenden kann, der nach dem Abrufen der übereinstimmenden Zeilen wieder eine Sortierung vornimmt.

douglasr
quelle