MySQL5においてインデックスがうまく使えないのですが、アドバイスをいただけると助かります。

おおよそ下記の通りなのですが、簡略化するために省略しているところもあります。

[1] データ構造(テーブル名 data)

id(主キー)
value(int6)
year(int4)
month(int2)

[2] インデックスを作成

ALTER TABLE `data` ADD INDEX ( `year` , `month` ) ;

[3] クエリ(2008年10月 ~ 2008年12月を集計)

SELECT SUM(value) FROM data WHERE (year,month) >= (2008,10) AND (year,month) <= (2008,12)

[4 ] EXPLAINの結果

id 1
select_type SIMPLE
table data
type ALL
possible_keys NULL
key NULL
key_len NULL
ref NULL
rows 204
Extra Using where

回答の条件
  • 1人5回まで
  • 登録:2008/12/20 13:18:19
  • 終了:2008/12/22 09:24:21

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402008/12/20 13:50:32

ポイント60pt

MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.2.6 インデックス結合最適化

WHERE (year,month) >= (2008,10) AND (year,month) <= (2008,12)

この構文がインデックスの利用を妨げているんでは?

WHERE year = 2008 AND month BETWEEN 10 AND 12

とかにすればインデックスを利用すると思う。

ただ、実際の検索条件はもっと複雑だろうから、簡潔に記述できるようにクエリ作成時に注意する必要はある。


MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.2.15 テーブルスキャンを避ける方法

また、テーブル自体の件数が少なかったりでインデックスを使用した方が遅いと判断した場合も

利用しないのでそこは確認しておいた方がいい。

id:southgate_01

申し訳ありません、お返事がおそくなりました。


year int4 (2008)

month int6 (200812)


4文字分データ量が増えるのですがこんな感じでやってみることにしました。

2008/12/22 09:23:31

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません