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

MYSQL OR vs IN ydeevne

Jeg havde brug for at vide dette med sikkerhed, så jeg benchmarkede begge metoder. Jeg fandt konstant IN at være meget hurtigere end at bruge OR .

Tro ikke på folk, der giver deres "mening", videnskab handler om testning og beviser.

Jeg kørte en løkke på 1000x de tilsvarende forespørgsler (for at opnå konsistens brugte jeg sql_no_cache ):

IN :2,34969592094s

OR :5,83781504631s

Opdatering:
(Jeg har ikke kildekoden til den originale test, som den var for 6 år siden, selvom den returnerer et resultat i samme område som denne test)

På anmodning om en prøvekode til at teste dette, er her den enklest mulige brugssag. Ved at bruge Eloquent for enkel syntaks udfører rå SQL-ækvivalent det samme.

$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



  1. Django + Postgres + Large Time Series

  2. Syntetisk datagenerering

  3. Multi-Cloud Full Database Cluster Failover-indstillinger for MariaDB Cluster

  4. Er du sorteret? Tips vedrørende T-SQL-vinduebestilling