Saya perlu mengetahui hal ini dengan pasti, jadi saya membandingkan kedua metode tersebut. Saya secara konsisten menemukan IN
menjadi jauh lebih cepat daripada menggunakan OR
.
Jangan percaya orang yang memberikan "pendapat" mereka, sains adalah tentang pengujian dan bukti.
Saya menjalankan loop 1000x kueri yang setara (untuk konsistensi, saya menggunakan sql_no_cache
):
IN
:2.34969592094s
OR
:5.83781504631s
Pembaruan:
(Saya tidak memiliki kode sumber untuk pengujian asli, seperti yang dilakukan 6 tahun yang lalu, meskipun hasilnya dalam kisaran yang sama dengan pengujian ini)
Dalam permintaan beberapa kode sampel untuk menguji ini, berikut adalah kasus penggunaan yang paling sederhana. Menggunakan Eloquent untuk kesederhanaan sintaks, setara SQL mentah mengeksekusi hal yang sama.
$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