まず、似たような質問を数多く見てきましたが、それらはすべて、インデックスなしのTimestamp
およびDateTime
フィールドタイプに関連しています。少なくともそれは私の理解です。
ご存じのとおり、DateTimeに関しては特定の利点があります。それらを1分間脇に置き、テーブルのエンジンがInnoDB
で10+ million records
、基準が以下に基づいている場合、どのクエリがより高速に実行されますか。
- インデックス付きのDateTime
- インデックス付き整数
言い換えると、日付と時刻をDateTime
またはUNIXタイムスタンプとしてint
?に保存する方が適切です。組み込みのMySQL関数を使用する必要がないことに注意してください。
更新
MySQL 5.1.41(64ビット)と1000万件のレコードでテストされた最初のテストでは、int
を優先して速度の大幅な違いが示されました。 2つのテーブルが使用されました、tbl_dt
with DateTime
およびtbl_int
とint
列。いくつかの結果:
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_dt`;
+----------+
| COUNT(*) |
+----------+
| 10000000 |
+----------+
1 row in set (2 min 10.27 sec)
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_int`;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (25.02 sec)
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_dt` WHERE `created` BETWEEN '2009-01-30' AND '2009-12-30';
+----------+
| COUNT(*) |
+----------+
| 835663 |
+----------+
1 row in set (8.41 sec)
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_int` WHERE `created` BETWEEN 1233270000 AND 1262127600;
+----------+
| COUNT(*) |
+----------+
| 835663 |
+----------+
1 row in set (1.56 sec)
shantanuo で提案されているように、1つのテーブルに両方のフィールドを含む別の更新を投稿します。
更新#2
多数のサーバークラッシュ後の最終結果:)どのクエリが実行されても、int型は大幅に高速で、速度の差は上記の結果とほぼ同じでした。
観察された「奇妙な」ことは、2つの両方のフィールドタイプが同じテーブルに格納されている場合、実行時間がほぼ同じであったことです。 MySQLは、DateTimeとintの両方に格納されている値が同じである場合を判断するのに十分なほどスマートです。この件に関するドキュメントが見つからなかったため、これは単なる観察です。
私の本能は、intは常に高速であると言うことです。しかし、これはそうではないようです
追加のために編集:MyISAMではなくInnoDBを使用していることは承知していますが、InnoDBのケースでこれに矛盾するものは見つかりませんでした。また、同じ作者がInnoDBテストを行いました
上記の回答で述べたテスト で、著者は基本的にUNIX time
は事前に計算され、INT
が優先されます。
mysqlサーバーのDATETIME、TIMESTAMP、INTタイプの素晴らしい比較とベンチマークでわかるように、それはアプリケーションに依存します MySQL日付形式:使用するデータ型は?日時、タイムスタンプ、INTを比較します。 ある状況ではINTのパフォーマンスが他の状況よりも優れている場合があり、場合によってはDATETIMEの方がパフォーマンスが優れていることがわかります。そしてそれはあなたのアプリケーションに完全に依存します