首先让我说我看过许多类似的问题,但它们都与没有索引的 Timestamp
和 DateTime
字段类型有关。至少这是我的理解。
众所周知,DateTime 有一定的优势。将它们放在一边,假设表的引擎是 InnoDB
,具有 10+ 百万条记录
,当条件基于时,哪个查询会执行得更快:
- DateTime with index
- int with index
换句话说,将日期和时间存储为DateTime
或int
中的UNIX时间戳更好?请记住,不需要使用任何内置的 MySQL 函数。
更新
使用 MySQL 5.1.41(64 位)和 1000 万条记录进行测试,初始测试显示有显着的速度差异有利于 int
。使用了两个表,tbl_dt
和 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 的建议在一个表中发布另一个包含两个字段的更新.
更新 #2
多次服务器崩溃后的最终结果 :) Int 类型明显更快,无论运行什么查询,速度差异或多或少与上述结果相同。
观察到的“奇怪”的事情是当两个字段类型存储在同一个表中时,执行时间或多或少相同。似乎 MySQL 足够聪明,可以确定存储在 DateTime 和 int 中的值何时相同。尚未找到有关该主题的任何文档,因此只是一个观察结果。
最佳答案
我在 test mentioned in the above answer 中看到了,作者基本证明了,提前计算出UNIX时间
时,INT
胜出。
关于MySQL 整数与日期时间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4594229/