カテゴリー
MySQL

MySQL DATETIME型へのINDEX注意点

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 秒

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください