datetime型のカラムから日付データを引っ張ってくる際の高速化

はてなブックマーク - datetime型のカラムから日付データを引っ張ってくる際の高速化
このエントリーをはてなブックマークに追加
Share on Facebook

ちょっとMySQLのチューニングをしたらすごく早くなったので、メモメモ。

datetime型のカラムから日付のみをwhere訳にデータを引っ張ってくることはよくあります。
で、レコードが数万行になってくるとけっこう遅くなったりする。
そしてカラムにインデックスを張っても全然速度があがらなかったりします。
これはクエリーがインデックスを使用していないからなんですね。
苦しまぎれにdate型のカラムを作って日付だけを入れるという手法もありますが、ちょっとスマートじゃないです。
datetime型を維持したままで高速化できます。

例えばこういうクエリー

SQL

select * from item where 'datetime' like '2010-06-23%';

あとはこんなクエリー

SQL

select * from item where 'datetime' >= '2010-06-23 00:00:00' and 'datetime' <= '2010-06-23 23:59:59';

後者の方がちょっとマシですが、どちらもインデックスを見ていないので、レコード数が増えるにつれてだんだんと重くなってきます。
このクエリーをこうしてあげましょう。

SQL

select * from item where 'datetime' between '2010-06-23 00:00:00' and '2010-06-23 23:59:59';

between datetime型 and datetime型の文体にすることでインデックスが使用され、高速化するんですね。
こんな書き方もできます。

SQL

select * from item where 'datetime' between '2010-06-23' and '2010-06-23' + interval 1 day;

かなり早くなるのでお試しください!
いままでのクエリーも書き直さないと・・・・。

datetime型のカラムから日付データを引っ張ってくる際の高速化” への2件のコメント

  1. ピンバック: ITキヲスク | 2010年6/20~6/26の週間ブックマーク

  2. ピンバック: MySQLでdatetime型のカラムから日付データを取り出すメモ | takulab

コメントをどうぞ

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">