Avevo bisogno di saperlo per certo, quindi ho confrontato entrambi i metodi. Ho costantemente trovato IN
essere molto più veloce rispetto all'utilizzo di OR
.
Non credere alle persone che danno la loro "opinione", la scienza è tutta una questione di test e prove.
Ho eseguito un ciclo di 1000 volte le query equivalenti (per coerenza, ho usato sql_no_cache
):
IN
:2.34969592094
OR
:5.83781504631s
Aggiornamento:
(Non ho il codice sorgente per il test originale, come era 6 anni fa, anche se restituisce un risultato nello stesso intervallo di questo test)
Alla richiesta di un codice di esempio per testarlo, ecco il caso d'uso più semplice possibile. Usando Eloquent per semplicità di sintassi, l'equivalente SQL grezzo esegue lo stesso.
$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