Je devais en avoir le cœur net et j'ai donc testé les deux méthodes. J'ai toujours trouvé IN
est beaucoup plus rapide que l'utilisation de OR
.
Ne croyez pas les personnes qui donnent leur "opinion", la science est faite 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
Mise à jour :
(Je n'ai pas le code source du test original, car il date d'il y a 6 ans, mais il renvoie un résultat dans la même fourchette que ce test).
Si je demande 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 s'exécute de la même manière.
$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
0 votes
Je suis également en train de faire des recherches sur ce sujet, mais je m'oppose à ce que les déclarations IN soient converties en lignes de OR.
s I could say that it can also be converted to UNION
s qui est recommandé pour remplacer les OR`s afin d'optimiser la requête.1 votes
Il y a eu quelques changements d'optimisation dans ce domaine, donc certaines des réponses suivantes peuvent être "dépassées".
0 votes
En particulier. Le nombre d'articles mai matière. La façon dont les chiffres sont "agglutinés" mai matière (
BETWEEN 1 AND 4
correspond parfaitement, et mai être plus rapide). La version de MySQL/MariaDB mai matière.