Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desempenho do MYSQL OR vs IN


Eu precisava saber disso com certeza, então eu comparei os dois métodos. Eu encontrei consistentemente IN ser muito mais rápido do que usar OR .

Não acredite em pessoas que dão a sua "opinião", a ciência tem tudo a ver com testes e evidências.

Executei um loop de 1000x as consultas equivalentes (para consistência, usei sql_no_cache ):

IN :2,34969592094s

OR :5,83781504631s

Atualização:
(Não tenho o código-fonte do teste original, pois foi há 6 anos, embora retorne um resultado no mesmo intervalo deste teste)

Na solicitação de algum código de amostra para testar isso, aqui está o caso de uso mais simples possível. Usando o Eloquent para simplicidade de sintaxe, o equivalente SQL bruto executa o mesmo.
$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