- PR -

MySQLでwhere in ** を使用した際のインデックスの使われ方

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2007/07/18
投稿数: 26
投稿日時: 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をしようするとインデックスを見てくれないのでしょうか?



かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-07-19 01:09
MySQLの回答ではありませんが、統計情報などによって、
インデックススキャンよりも最適な方法があると判断された場合、
別のスキャン方法が採用されるケースもあります。

レコード数やinをorやexistsに変えてみて試してみてはいかがでしょうか。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-07-19 05:47
MySQLの質問をする場合は、バージョンを明記してください。

格納件数が相当に少ない状態で、Explainの結果を見ていませんか?

MySQL 5.0で確認したところ、以下のようになりました。
(Analyze Tableは、未実施)

全体行数=10では、inで2個までならインデクスが使われ、3個以上になるとインデクスを
使わなくなりました。

全体行数=30では、inで4個までならインデクスが使われ、5個以上になるとインデクスを
使わなくなりました。

テストで用いた表定義

コード:
create table tbl
(id    int        primary key auto_increment, 
 name  varchar(10));

未記入
常連さん
会議室デビュー日: 2007/07/18
投稿数: 26
投稿日時: 2007-07-19 21:53
こんばんは。

返信ありがとうございます。

>レコード数やinをorやexistsに変えてみて試してみてはいかがでしょうか。

ありがとうございます。
試してみます。


>格納件数が相当に少ない状態で、Explainの結果を見ていませんか?

約3万行で、inが4個でしか試せれていませんが、
inの数によっても変化するのですね。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)