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