Skąd mam wiedzieć, czy indeks jest używany do sortowania w MySQL?

10

Mam zapytanie z klauzulą ​​ORDER BY, która wykorzystuje kolumnę, która jest ostatnią kolumną w indeksie używanym w klauzuli WHERE, zasadniczo w postaci:

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

a indeks jest tworzony dla kolumn (col_1, col_2, col_3, col_4) w tej kolejności.

Kiedy profiluję zapytanie ponad 99% czasu spędza w stanie „Wynik sortowania”. kolumna_4 jest kolumną ze znacznikiem czasu, jeśli ma to znaczenie. Rozumiem, że ORDER BY może korzystać z indeksu tylko pod pewnymi warunkami, ale nadal jestem nieco zaskoczony, kiedy dokładnie to zrobiłby optymalizator.

Chris Cooper
źródło

Odpowiedzi:

13

Powinieneś dołączyć EXPLAIN EXTENDEDprzed zapytaniem i sam zobaczyć wynik.

Powinien mieć wpis dla

  • możliwe klucze

Jeśli ta kolumna ma wartość NULL, nie ma odpowiednich indeksów. W takim przypadku możesz poprawić wydajność zapytania, sprawdzając klauzulę WHERE, aby sprawdzić, czy odnosi się ona do niektórych kolumn lub kolumn, które byłyby odpowiednie do indeksowania.

i

  • Klucze

Kolumna klucza wskazuje klucz (indeks), którego MySQL faktycznie użył. Jeśli MySQL zdecyduje się użyć jednego z indeksów możliwy_klucz do wyszukiwania wierszy, ten indeks zostanie wymieniony jako wartość klucza.

Aby uzyskać więcej informacji, zapoznaj się z danymi wyjściowymi Wyjaśnij i Wyjaśnij typy złączeń

Mahesh Patil
źródło
Rozumiem, moje pytanie dotyczy konkretnie klauzuli ORDER BY. Moje zapytanie używa określonego indeksu do ograniczenia zwracanych wierszy, ale biorąc pod uwagę wydajność tego rodzaju, zgaduję, że nie używa go dla klauzuli ORDER BY.
Chris Cooper
1
W niektórych przypadkach MySQL może użyć indeksu w celu spełnienia klauzuli ORDER BY bez dodatkowego sortowania. Z indeksu można również korzystać, nawet jeśli ORDER BY nie pasuje dokładnie do indeksu, o ile wszystkie nieużywane części indeksu i wszystkie dodatkowe kolumny ORDER BY są stałymi w klauzuli WHERE. Poniższe zapytania używają indeksu do rozwiązania części ZAMÓWIENIE PRZEZ to dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil
1

Używasz EXPLAINw zapytaniu ( explain select-or-whatever-your-query-is).

possible_keyspokaż te, które mogą być użyte, keyte faktycznie wykorzystane.

sjas
źródło
1
Aby dodać do tego: explain format=json select ...jest jeszcze bardziej wydajny. Obejmuje on used_key_parts, który informuje, czy klucz złożony został użyty częściowo czy w całości, i index_conditioninformuje, która część zapytania odpowiada za który indeks.
okdewit,