Mysql
 sql >> Base de données >  >> RDS >> Mysql

Performances MYSQL OR vs IN

J'avais besoin de le savoir avec certitude, alors j'ai comparé les deux méthodes. J'ai constamment trouvé IN pour être beaucoup plus rapide que d'utiliser OR .

Ne croyez pas les gens qui donnent leur "opinion", la science est une question de tests et de preuves.

J'ai exécuté une boucle de 1000x les requêtes équivalentes (pour la cohérence, j'ai utilisé sql_no_cache ):

IN :2.34969592094s

OR :5.83781504631s

Mettre à jour :
(Je n'ai pas le code source du test d'origine, car il y a 6 ans, bien qu'il renvoie un résultat dans la même plage que ce test)

À la demande d'un exemple de code pour tester cela, voici le cas d'utilisation le plus simple possible. En utilisant Eloquent pour la simplicité de la syntaxe, l'équivalent SQL brut exécute la même chose.

$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