- - PR -
MySQLでwhere in ** を使用した際のインデックスの使われ方
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-07-18 23:57
こんばんは。
現在、MySQLで性能を調査していますが、 気になった箇所があるので、ご相談させてください。 SQLとして、 select ID, NAME from TBL where ID in (1,2,3) order by ID desc のようなSQLを発行しています。 ここで、インデックスをIDに張っていますが、 Explainで確認するとfilesortとなってしまいます。 in区をなくし、単発の以下のようにすると、filesortはなくなりました。 select ID, NAME from TBL where ID = 1 order by ID desc ただ、このようにした場合は、複数回selectを実行しなくてはならず、 非効率になってしまいます。 MySQLの場合、inをしようするとインデックスを見てくれないのでしょうか? | ||||
|
投稿日時: 2007-07-19 01:09
MySQLの回答ではありませんが、統計情報などによって、
インデックススキャンよりも最適な方法があると判断された場合、 別のスキャン方法が採用されるケースもあります。 レコード数やinをorやexistsに変えてみて試してみてはいかがでしょうか。 | ||||
|
投稿日時: 2007-07-19 05:47
MySQLの質問をする場合は、バージョンを明記してください。
格納件数が相当に少ない状態で、Explainの結果を見ていませんか? MySQL 5.0で確認したところ、以下のようになりました。 (Analyze Tableは、未実施) 全体行数=10では、inで2個までならインデクスが使われ、3個以上になるとインデクスを 使わなくなりました。 全体行数=30では、inで4個までならインデクスが使われ、5個以上になるとインデクスを 使わなくなりました。 テストで用いた表定義
| ||||
|
投稿日時: 2007-07-19 21:53
こんばんは。
返信ありがとうございます。 >レコード数やinをorやexistsに変えてみて試してみてはいかがでしょうか。 ありがとうございます。 試してみます。 >格納件数が相当に少ない状態で、Explainの結果を見ていませんか? 約3万行で、inが4個でしか試せれていませんが、 inの数によっても変化するのですね。 ありがとうございました。 |
1