MYSQL OR vs IN performance

后端 未结 14 849
一向
一向 2020-11-22 04:12

I am wondering if there is any difference in regards to performance between the following

SELECT ... FROM ... WHERE someFIELD IN(1,2,3,4)

SELECT ... FROM ..         


        
14条回答
  •  臣服心动
    2020-11-22 04:39

    I needed to know this for sure, so I benchmarked both methods. I consistenly found IN to be much faster than using OR.

    Do not believe people who give their "opinion", science is all about testing and evidence.

    I ran a loop of 1000x the equivalent queries (for consistency, I used sql_no_cache):

    IN: 2.34969592094s

    OR: 5.83781504631s

    Update:
    (I don't have the source code for the original test, as it was 6 years ago, though it returns a result in the same range as this test)

    In request for some sample code to test this, here is the simplest possible use case. Using Eloquent for syntax simplicity, raw SQL equivalent executes the same.

    $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

提交回复
热议问题