sql >> データベース >  >> RDS >> Mysql

MYSQL ORvsINパフォーマンス

    これを確実に知る必要があったので、両方の方法のベンチマークを行いました。私は一貫してINを見つけました ORを使用するよりもはるかに高速です 。

    「意見」を述べる人を信じないでください。科学はテストと証拠がすべてです。

    同等のクエリの1000倍のループを実行しました(一貫性を保つために、 sql_no_cacheを使用しました ):

    IN :2.34969592094s

    または :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. PostgreSQL:なぜpsqlがサーバーに接続できないのですか?

    2. SQLite式ベースのインデックス

    3. SQLServerトランザクションレプリケーションの問題のトラブルシューティング

    4. regex_substrの句で接続