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

MySQL:Dlaczego 5. ID w klauzuli IN drastycznie zmienia plan zapytań?

Jak pokazałeś, MySQL ma dwa alternatywne plany zapytań dla zapytań z ORDER BY ... LIMIT n :

  1. Przeczytaj wszystkie kwalifikujące się wiersze, posortuj je i wybierz n górne rzędy.
  2. Przeczytaj wiersze w kolejności posortowanej i zatrzymaj się, gdy n znaleziono kwalifikujące się wiersze.

Aby zdecydować, która opcja jest lepsza, optymalizator musi oszacować efekt filtrowania warunku WHERE. Nie jest to proste, szczególnie w przypadku kolumn, które nie są indeksowane lub w przypadku kolumn, w których wartości są skorelowane. W twoim przypadku prawdopodobnie trzeba przeczytać o wiele więcej tabeli w posortowanej kolejności, aby znaleźć pierwszych 25 kwalifikujących się wierszy, niż oczekiwał optymalizator.

Wprowadzono kilka ulepszeń w sposobie obsługi zapytań LIMIT, zarówno w nowszych wersjach 5.6 (używasz wersji przed GA!), jak i nowszych (5.7, 8.0). Proponuję spróbować uaktualnić do nowszej wersji i sprawdzić, czy to nadal stanowi problem.

Ogólnie rzecz biorąc, jeśli chcesz zrozumieć decyzje planisty zapytań, powinieneś przyjrzeć się śladowi optymalizatora dla zapytania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL łączy tabele, w których nazwa tabeli jest polem innej tabeli

  2. Zależność cykliczna mysql w ograniczeniach kluczy obcych

  3. Czy możesz dołączyć do podzapytania z Doctrine 2 DQL?

  4. Bigquery:przeszukuj wiele tabel i agreguj z first_seen i last_seen

  5. Zapytanie, aby znaleźć duplikaty między nazwiskiem a numerem w tabeli