Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL EXPLAIN 'typ' zmienia się z 'zakres' na 'ref' po zmianie daty w instrukcji where?

Różne strategie wyszukiwania mają sens dla różnych danych. W szczególności, skanowanie indeksów (takich jak zakres) często musi próbować faktycznie odczytać wiersz. W pewnym momencie wykonanie wszystkich tych poszukiwań jest wolniejsze niż nieużywanie indeksu w ogóle.

Weźmy trywialny przykład, tabelę z trzema kolumnami:id (klucz podstawowy), imię (z indeksem), urodziny. Powiedzmy, że ma dużo danych. Jeśli poprosisz MySQL o wyszukanie urodzin Boba, zrobi to dość szybko:najpierw znajdzie Boba w indeksie nazwisk (zajmuje to kilka wyszukiwań, log(n), gdzie n to liczba wierszy), a następnie jedno dodatkowe wyszukiwanie do odczytaj rzeczywisty wiersz w pliku danych i odczytaj z niego datę urodzin. To bardzo szybkie i znacznie szybsze niż skanowanie całej tabeli.

Następnie rozważ wykonanie name like 'Z%' . To prawdopodobnie dość mała część tabeli. Tak więc nadal szybciej jest znaleźć miejsce, w którym zaczynają się litery Z w indeksie nazw, a następnie dla każdego z nich szukać pliku danych, aby odczytać wiersz. (To jest skanowanie zakresu).

Na koniec rozważ poproszenie o wszystkie nazwy zaczynające się od M-Z. To prawdopodobnie około połowa danych. Może przeprowadzić skanowanie zakresu, a potem dużo poszukiwań, ale wyszukiwanie losowe nad plikiem danych, którego ostatecznym celem jest odczytanie połowy wierszy, nie jest optymalne:szybciej byłoby po prostu wykonać duży sekwencyjny odczyt pliku danych. Tak więc w tym przypadku indeks zostanie zignorowany.

To właśnie widzisz — z wyjątkiem tego, że w twoim przypadku jest inny klucz, na którym może się oprzeć. (Możliwe jest również, że może faktycznie użyć indeksu dat, jeśli nie ma drugiego, powinien wybrać ten indeks, który będzie najszybszy. Uważaj, że optymalizator MySQL często popełnia w tym błędy.)

Krótko mówiąc, jest to oczekiwane. Zapytanie nie mówi jak aby pobrać dane, raczej mówi co dane do pobrania. Optymalizator bazy danych powinien znaleźć najszybszy sposób na jej odzyskanie.

Możesz znaleźć indeks na obu kolumn w kolejności (klucz_publiczny,utworzony_w dniu_data) jest preferowana w obu przypadkach i przyspiesza zapytanie. Dzieje się tak, ponieważ MySQL może zawsze używać tylko jednego indeksu na tabelę (na zapytanie). Ponadto data kończy się, ponieważ skanowanie zakresu może być wykonane efektywnie tylko na ostatniej kolumnie w indeksie.

[InnoDB faktycznie ma inną warstwę pośredniości, jak sądzę, ale to po prostu myliłoby sprawę. Nie ma to żadnego znaczenia w wyjaśnieniu.]




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. format daty w node.JS

  2. Jak wdrożyć Percona Server dla MySQL w celu zapewnienia wysokiej dostępności

  3. Migracje baz danych na produkcję django

  4. Czy powinienem pingować serwer mysql przed każdym zapytaniem?

  5. BŁĄD:HHH000299:Nie można ukończyć aktualizacji schematu java.lang.NullPointerException