Kolejność według kolumny powinna mieć indeks, czy nie?

35

Do tabeli dodałem indeksy, które służą do wyszukiwania wyników. Wyświetlam wyniki według kolejności ASC lub DESC. Więc ta kolumna powinna mieć indeks, czy nie? Mam jeszcze 2 indeksy w tej tabeli. Jak wpłynie na wydajność, tworząc lub nie tworząc indeks do tej kolumny?

Somnath Muluk
źródło
2
Prześlij

Odpowiedzi:

26

Tak, MySQL może używać indeksu dla kolumn w ORDER BY (pod pewnymi warunkami). Jednak MySQL nie może używać indeksu dla mieszanego sortowania ASC, DESC według ( SELECT * FROM foo ORDER BY bar ASC, pants DESC). Udostępnianie zapytania i instrukcji CREATE TABLE pomogłoby nam bardziej szczegółowo odpowiedzieć na twoje pytanie.

Wskazówki dotyczące optymalizacji klauzul ORDER BY: http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

Edytuj 21.01.2012 08:53

Pojawiły się pytania dotyczące źródła mojej wypowiedzi na temat używania indeksu z mieszanym ASC / DESC w ORDER BY. Z dokumentacji optymalizacji ORDER BY :

W niektórych przypadkach MySQL nie może użyć indeksów do rozwiązania ORDER BY, chociaż nadal używa indeksów do znalezienia wierszy pasujących do klauzuli WHERE. Przypadki te obejmują:

...

Mieszasz ASC i DESC:

WYBIERZ * Z t1 ORDER BY key_part1 DESC, key_part2 ASC;

...

Ponadto słowo kluczowe DESC w CREATE INDEX nie ma znaczenia

Specyfikacja indeksu nazwa_kolumny może kończyć się na ASC lub DESC. Te słowa kluczowe są dozwolone w przyszłych rozszerzeniach do określania rosnącego lub malejącego przechowywania wartości indeksu. Obecnie są analizowane, ale ignorowane; wartości indeksu są zawsze przechowywane w porządku rosnącym.

Aaron Brown
źródło
3
„MySQL nie może używać indeksu dla mieszanego ASC, DESC” . Odniesienie do tego?
ypercubeᵀᴹ
CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);powinno działać.
Frank Heikens
Moim źródłem jest dokumentacja mysql połączona z moją odpowiedzią. Wyszukaj „mix”.
Aaron Brown
3
MySQL analizuje asc i Desc w CREATE INDEX, ale je ignoruje. Indeksy są zawsze przechowywane w porządku rosnącym. dev.mysql.com/doc/refman/5.5/en/create-index.html
Aaron Brown
1
Nowy z MySQL 8.0 : Teraz można go stosować mieszaninę ASCi DESC jeśliINDEX ma taką samą mieszankę.
Rick James
4

Dla każdego, kto zastanawia się nad odpowiedzią dotyczącą PostgreSQL, odpowiedź brzmi: tak, zostanie użyty indeks. Zgodnie z dokumentacją PostgreSQL planista zapytań „rozważy spełnienie specyfikacji ORDER BY albo poprzez skanowanie dostępnego indeksu, który pasuje do specyfikacji, albo przez skanowanie tabeli w fizycznej kolejności i wykonanie jawnego sortowania”. Oznacza to, że jeśli istnieje indeks, którego planista może użyć, zrobi to, wracając do robienia sortowania po pobraniu pasujących wierszy.

douglasr
źródło