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

SELECT ... WHERE IN(...)を最適化する

    SELECT * FROM  products                         <<-- select * is non-optimal
    WHERE  prodid in (10331,11639,12127..) 
    ORDER BY Field(prodid, 10331,11639,12127...);   <<-- your problem is here
    

    まず、prodidにインデックスを付けます @Anthonyの回答を参照してください。

    クエリを次のように変更するより:

    SELECT only,the,fields,you,need FROM  products
    WHERE  prodid in (10331,11639,12127..) 
    ORDER BY prodid
    

    INを確認した場合 リストは、INに提供する前に昇順で並べ替えられます 句、order by prodid order by field(...)と同じ結果が得られます

    • フィールドの代わりに関数を使用すると、インデックスを使用する可能性がなくなり、速度が低下します。
    • select * 不要なデータをフェッチするため、ディスクアクセスが増え、メモリ使用量が増え、ネットワークトラフィックが増えます。
    • InnoDBで、selectのみを選択した場合 インデックス付きフィールドの場合、MySQLはテーブルを読み取ることはありませんが、インデックスを節約する時間のみです(この場合、これはおそらく問題ではありません)

    使用できるトリックがいくつかあります。

    • productsテーブルが大きすぎない場合は、memoryにすることができます。 RAMに保存されているテーブル。大きなテーブルではこれを行わないでください。他の処理が遅くなります。
      使用できるのはhashのみです。 メモリテーブルのインデックス。
    • prodidが連続している場合は、BETWEEN 1000 AND 1019を使用できます。
      IN (1000, 1001 ..., 1019)の代わりに


    1. PostgreSQLLIKEクエリのパフォーマンスのバリエーション

    2. 最大値を見つけて、SQLサーバーの別のフィールドから対応する値を表示します

    3. MySQL:1つのクエリで2つのことを数えますか?

    4. MySQLで「存在しない場合は挿入」するにはどうすればよいですか?