Necesitaba saber esto con certeza, así que comparé ambos métodos. Siempre encontré IN
ser mucho más rápido que usar OR
.
No le creas a la gente que da su "opinión", la ciencia se trata de pruebas y pruebas.
Ejecuté un ciclo de 1000 veces las consultas equivalentes (por consistencia, usé sql_no_cache
):
IN
:2.34969592094s
OR
:5.83781504631s
Actualizar:
(No tengo el código fuente de la prueba original, ya que era hace 6 años, aunque arroja un resultado en el mismo rango que esta prueba)
En la solicitud de un código de muestra para probar esto, aquí está el caso de uso más simple posible. Usando Eloquent para simplificar la sintaxis, el equivalente de SQL sin formato ejecuta lo mismo.
$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