2009 5月18日

MySQLのDATETIME型へインデックスをつける場合注意が必要。
例えばこんなSQLではインデックスが使用されない。

SELECT * FROM `table` WHERE `datetime` LIKE ‘2009-05-17%’

検索結果は2009-05-17分全てが抽出されるが、フルスキャンがかかる。
この場合、以下のようなSQLが良い。

SELECT * FROM `table` WHERE `date_time` BETWEEN ‘2009-05-17′ AND ‘2009-05-17′ + INTERVAL 1 DAY

実行時間計測の例
行数:13,776行
データ:2,935KB
インデックス:datetime


SELECT SUM( `col` ) FROM `table`
WHERE `datetime` LIKE ‘2009-05-17%’

フルスキャン
実行時間:0.0235 秒


SELECT SUM( `col` ) FROM `table`
WHERE DATE(datetime) = ‘2009-05-17′

フルスキャン
実行時間:0.0383 秒


SELECT SUM( `col` ) FROM `table`
WHERE `date_time` BETWEEN ‘2009-05-17′
AND ‘2009-05-17′ + INTERVAL 1 DAY

インデックス使用
実行時間:0.0009 秒