Mysql
 sql >> Database >  >> RDS >> Mysql

Prestazioni di MySQL OR vs IN

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