[[MySQL]]
MySQLで日付データを扱う場合、DATETIME型よりもUNIXTIMEのINT型で扱った方が、3倍速くなるというレポートがあった。
http://blog.fukaoi.org/2009/03/19/mysql_datetime
*MySQLでDATETIME型のデータを高速に検索する方法 [#d2fbf9b6]
MySQLでDATETIME型のカラムを追加して、YYYY-MM-DD HH:MM:SSの形式でデータを保存することはよくあるケースだと思う。
DATETIME型のカラムをWHERE以降の条件句に指定して、年月日時でデータの絞込みを行い目的のデータを抽出するという時に、より高速にデータを取得できないかと考えてみた。
**結論 [#pe5025bb]
DATETIME型で保存するのではなく、UNIX_TIMESTAMP関数を使いINT型にコンバートした形式で保存することにより、DATETIME型より3倍~4倍高速化が実現できた。
その際に注意しなければならないのが、INT型の年月日時を指定したカラムを生成しても実際にクエリを生成する際に、'1219485900'(シングルクォート)して文字列(STRING型)として指定しないこと。
うっかりこのように指定してしまうと、カラムがINT型であっても処理スピードが遅くなってしまう。
ただし、このINT型で年月日時データを保存する方法にもデメリットがあって、UNIX_TIMESTAMPなので直感的に見て人間が理解しずらいのである。
そのためサーバのコマンドラインよりMySQL Clientを使いダイレクトにアクセスしデータを取得する必要があるケース(exp. 人間の手による緊急的な集計オペレーション)では、YYYY-MM-DD HH:MM:SSの形式にコンバートする必要があるかと思う。
その場合は人手間だが以下のようにFROM_UNIXTIME関数を使用して結果を出力してほしい
#code(sql){{
SELECT id, FROM_UNIXTIME(unixtime) FROM test_unixtime
WHERE unixtime BETWEEN 1219485600 AND 1219485900;
}}