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

Dlaczego mysql hit index, gdy kolumna zawija się z funkcją daty?

Wiadomo, że raport EXPLAIN jest trudny do interpretacji. Przeładowali zbyt wiele informacji w kilku polach. Możesz spróbować

type: index wskazuje, że wykonuje skanowanie indeksu , co oznacza, że ​​odwiedza każdy wpis w indeksie.

Odwiedza tę samą liczbę wpisów co skanowanie tabeli, z wyjątkiem tego, że dotyczy to indeksu pomocniczego zamiast indeksu klastrowego (podstawowego).

Gdy widzimy type: index , EXPLAIN pokazuje possible_keys: NULL co oznacza, że ​​nie może używać żadnego indeksu do efektywnego wyszukiwania. Ale pokazuje też key: add_time co oznacza, że ​​indeks używany do skanowania indeksów to add_time .

Skanowanie indeksów wynika z faktu, że MySQL nie może sam zoptymalizować wyrażeń lub wywołań funkcji. Na przykład, jeśli chcesz wyszukać daty z określonym miesiącem, możesz wyszukać month(add_time) = 4 ale to nie spowodowałoby użycia indeksu w add_time, ponieważ daty z tym miesiącem są rozrzucone po indeksie, a nie wszystkie zgrupowane razem.

Być może wiesz, że date(add_time) powinien być możliwy do przeszukiwania według indeksu, ale MySQL nie robi tego wnioskowania. MySQL po prostu widzi, że używasz funkcji i nawet nie próbuje użyć indeksu.

Dlatego MySQL 5.7 wprowadził wygenerowane kolumny aby umożliwić nam indeksowanie wyrażenia, a MySQL 8.0 jeszcze go ulepszył, zezwalając na indeks zdefiniowany dla wyrażenia bez konieczności wcześniejszego zdefiniowania wygenerowanej kolumny.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. EntityFramework 6.1.3 i MySQL DbFunctions.TruncateTime nie istnieje?

  2. Pozostawiono Dołącz do najnowszego rekordu

  3. mysql - dołączanie do pierwszego i ostatniego rekordu według typu grupy?

  4. Zagregowana suma obiektów JSON w MySQL

  5. Szalony Sporadyczny Wordpress:Błąd podczas nawiązywania połączenia z bazą danych