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

Czy istnieje różnica w wydajności między BETWEEN i IN w MySQL lub ogólnie w SQL?

BETWEEN powinien przewyższa IN w tym przypadku (ale tak mierzyć i sprawdzać również plany wykonania!), zwłaszcza jako n rośnie, a statystyki są nadal dokładne. Załóżmy:

  • m to rozmiar twojego stołu
  • n to rozmiar twojego asortymentu

Indeks może być użyty (n jest mały w porównaniu do m )

  • Teoretycznie BETWEEN można zaimplementować za pomocą pojedynczego „skanowania zakresu” (mówienie Oracle) na indeksie klucza podstawowego, a następnie przejść co najwyżej n węzły liści indeksu. Złożoność będzie wynosić O(n + log m)

  • IN jest zwykle implementowany jako seria (pętla) n „skanowanie zakresu” w indeksie klucza podstawowego. Z m będąc rozmiarem tabeli, złożoność zawsze będzie wynosić O(n * log m) ... co zawsze jest gorsze (nieistotne dla bardzo małych tabel m lub bardzo małe zakresy n )

Nie można użyć indeksu (n to znaczna część m )

W każdym razie uzyskasz pełne skanowanie tabeli i ocenisz predykat w każdym wierszu:

  • BETWEEN musi ocenić dwa predykaty:jeden dla dolnej granicy, a drugi dla górnej granicy. Złożoność to O(m)

  • IN musi ocenić co najwyżej n predykaty. Złożoność to O(m * n) ... co znowu jest zawsze gorsze, a może O(m) czy baza danych może zoptymalizować IN lista ma być hashmapą, a nie listą predykatów.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL połącz 2 tabele z 1 tabelą

  2. bind_param() konieczne tylko w przypadku wartości wprowadzonych przez użytkownika czy wszystkich?

  3. Jak wykonać zapytanie o pola zawierające dany tekst w MySQL?

  4. PHP mysql PDO odmawia ustawienia wartości NULL

  5. Kiedy używać pojedynczych cudzysłowów, podwójnych cudzysłowów i znaków wstecznych w MySQL