2012-01-05 5 views
1

2000以上のIDが言うように、)私はmysqlクエリを最適化するには "in"オペランドが含まれていますか?

select * from logs where uid in (id1, id2, ...) 

のようなクエリを持っていますが、中のリスト(中には非常に多くのIDがあります場合、私はパフォーマンスの心配は、さえ説明の出力に従って、この文はインデックスを使用しませんon uidカラム。 この種の条件で他の方法でクエリを実行する方法や、このSQL文の最適化を行う方法があるかどうかを知りたいですか?

いずれの回答もありがとうございます。

補足:表形式はmyisamです。何らかの理由でストレージエンジンを変更できません。

+0

これに問題がありますか? –

+1

()内のIDが特定の条件の別のテーブルから来た場合は、joinを使用できます。 uidが任意のユーザー入力から来た場合、私はあなたがそれについて多くを行うことはできないと思います。 –

+0

@andreasはい、idsは別のデータソースから来ています。それらを「uid = id1またはuid = id2 or ....」に分けておけば助けになりますか? – hago

答えて

2

2000アイテム?!?ウワ!

提案: テーブルにあなたの2000個の項目を書く、と

+0

それは実質的に異なっていますか? –

+1

その目的は何ですか? – newtover

+0

これらのuidはリクエストごとに異なります。一時表にコストがかかりますか? – hago

0

「(...)でuidはここで、」私はすでに上記のコメントで同様の質問へのリンクを言及した内部結合の代わりにします。

さらに、この種のクエリは、いくつかの種類のJOINSをスピードアップするためにMySQLで集中的に使用されることになっています。クエリの結果をクエリキャッシュで簡単にキャッシュすることができます。つまり、結合を複数の小さなクエリに分割すると、そのうちの1つのキャッシュ結果は常に無効になりますが、他はかなり安定している)。 IN演算子は、オペランドをソートしてランダムなインデックス読み取りを減らします。

本当に気にしなければならないのは、文字列ではなくintをintとして渡して、オペランドが正しくソートされるようにすることです。