首先,我要说我查看了很多类似的问题,但它们都涉及到没有索引的Timestamp
和DateTime
字段类型。至少这是我的理解。
正如我们所知道的那样,DateTime
具有某些优点。暂且不提它们,并假设表的引擎为InnoDB
,记录数为1000万
。在基于以下条件的查询中,哪个查询会更快:
- 带有索引的DateTime
- 带有索引的int
换句话说,将日期和时间存储为DateTime
还是UNIX时间戳的int
更好?请记住,不需要使用任何内置的MySQL函数。
更新
在MySQL 5.1.41(64位)和1000万条记录下测试后,最初的测试结果显示int
更快。使用了两个表,一个带有DateTime
列的tbl_dt
和一个带有int
列的tbl_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。
更新#2
经过多次服务器崩溃后的最终结果:) Int类型更快,无论运行哪个查询,速度差异都与上面的结果差不多。
观察到的“奇怪”现象是,当两种字段类型存储在同一表中时,执行时间或多或少相同。看来MySQL足够聪明,能够在DateTime和int中存储相同值时找出差异。还没有找到任何关于这个主题的文档,因此只是个人观察。