Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Leistung von MYSQL OR vs. IN

Ich musste das sicher wissen, also habe ich beide Methoden verglichen. Ich habe durchweg IN gefunden um viel schneller zu sein als die Verwendung von OR .

Glauben Sie nicht Leuten, die ihre "Meinung" äußern, Wissenschaft dreht sich alles um Tests und Beweise.

Ich habe eine Schleife mit dem 1000-fachen der entsprechenden Abfragen ausgeführt (aus Gründen der Konsistenz habe ich sql_no_cache verwendet ):

IN :2.34969592094s

OR :5.83781504631s

Aktualisieren:
(Ich habe nicht den Quellcode für den ursprünglichen Test, wie er vor 6 Jahren war, obwohl er ein Ergebnis im gleichen Bereich wie dieser Test zurückgibt)

Bei der Bitte um Beispielcode, um dies zu testen, hier ist der einfachste mögliche Anwendungsfall. Unter Verwendung von Eloquent zur Vereinfachung der Syntax führt das rohe SQL-Äquivalent dasselbe aus.

$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