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

Wydajność MYSQL OR vs IN

Musiałem to wiedzieć na pewno, więc porównałem obie metody. Konsekwentnie znalazłem IN być znacznie szybszym niż użycie OR .

Nie wierz ludziom, którzy wyrażają swoją „opinię”, nauka polega na testowaniu i dowodach.

Uruchomiłem pętlę 1000x równoważnych zapytań (dla spójności użyłem sql_no_cache ):

IN :2,3496592094 s

OR :5,83781504631s

Aktualizacja:
(Nie mam kodu źródłowego oryginalnego testu, tak jak to było 6 lat temu, ale zwraca wynik w tym samym zakresie, co ten test)

Na prośbę o przykładowy kod do przetestowania, oto najprostszy możliwy przypadek użycia. Używając Eloquent dla uproszczenia składni, odpowiednik surowego SQL wykonuje to samo.

$t = microtime(true); 
for($i=0; $i<10000; $i++):
$q = DB::table('users')->where('id',1)
    ->orWhere('id',2)
    ->orWhere('id',3)
    ->orWhere('id',4)
    ->orWhere('id',5)
    ->orWhere('id',6)
    ->orWhere('id',7)
    ->orWhere('id',8)
    ->orWhere('id',9)
    ->orWhere('id',10)
    ->orWhere('id',11)
    ->orWhere('id',12)
    ->orWhere('id',13)
    ->orWhere('id',14)
    ->orWhere('id',15)
    ->orWhere('id',16)
    ->orWhere('id',17)
    ->orWhere('id',18)
    ->orWhere('id',19)
    ->orWhere('id',20)->get();
endfor;
$t2 = microtime(true); 
echo $t."\n".$t2."\n".($t2-$t)."\n";

1482080514.3635
1482080517.3713
3.0078368186951

$t = microtime(true); 
for($i=0; $i<10000; $i++): 
$q = DB::table('users')->whereIn('id',[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])->get(); 
endfor; 
$t2 = microtime(true); 
echo $t."\n".$t2."\n".($t2-$t)."\n";

1482080534.0185
1482080536.178
2.1595389842987



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak obliczyć depozyt zabezpieczający w MySQL

  2. Skonfiguruj bazę danych i utwórz użytkownika tylko do odczytu w AWS Redshift i Mysql

  3. Harmonogram zdarzeń MySQL codziennie o określonej godzinie

  4. Jak stworzyć połączony serwer MySQL

  5. Liczba kolumn nie odpowiada liczbie wartości w wierszu 1