Tôi cần biết điều này chắc chắn, vì vậy tôi đã chuẩn hóa cả hai phương pháp. Tôi luôn tìm thấy IN
nhanh hơn nhiều so với việc sử dụng OR
.
Đừng tin những người đưa ra "ý kiến" của họ, khoa học là tất cả về thử nghiệm và bằng chứng.
Tôi đã chạy một vòng lặp gấp 1000 lần các truy vấn tương đương (để nhất quán, tôi đã sử dụng sql_no_cache
):
IN
:2,34969592094 giây
OR
:5,83781504631 giây
Cập nhật:
(Tôi không có mã nguồn cho thử nghiệm ban đầu, như cách đây 6 năm, mặc dù nó trả về kết quả trong cùng phạm vi với thử nghiệm này)
Yêu cầu một số mã mẫu để kiểm tra điều này, đây là trường hợp sử dụng đơn giản nhất có thể. Sử dụng Eloquent để đơn giản hóa cú pháp, SQL thô tương đương sẽ thực thi giống nhau.
$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