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)
の代わりに