Mysql
 sql >> база данни >  >> RDS >> Mysql

Производителност на MYSQL OR срещу IN

Трябваше да знам това със сигурност, затова направих сравнителен анализ и на двата метода. Постоянно намирах IN да бъде много по-бърз от използването на OR .

Не вярвайте на хората, които дават своето „мнение“, науката е свързана с тестване и доказателства.

Изпълних цикъл от 1000 пъти еквивалентните заявки (за последователност използвах sql_no_cache ):

IN :2,34969592094s

OR :5,83781504631s

Актуализация:
(Нямам изходния код за оригиналния тест, както беше преди 6 години, въпреки че връща резултат в същия диапазон като този тест)

В заявка за примерен код, за да тествате това, ето най-простият възможен случай на употреба. Използвайки Eloquent за опростяване на синтаксиса, необработеният SQL еквивалент изпълнява същото.

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мигрирайте от традиционна репликация към GTID

  2. В MySQL мога ли да отложа проверките на референтната цялост до извършване

  3. Висока наличност при ограничен бюджет - внедряване на MySQL Galera Cluster с минимален два възела

  4. mysql проверява дали числата са в списък, разделен със запетая

  5. Намиране на дублиращи се стойности в MySQL