【发布时间】:2011-06-03 09:56:16
【问题描述】:
首先让我说我看过许多类似的问题,但它们都与Timestamp 和DateTime 字段类型相关,没有索引。至少这是我的理解。
众所周知,DateTime 有一定的优势。把它们放在一边,假设表的引擎是InnoDB 和10+ million records,当条件基于时,哪个查询会执行得更快:
- 带索引的日期时间
- 带索引的整数
换句话说,最好将日期和时间存储为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 中的值何时相同。尚未找到有关该主题的任何文档,因此只是一个观察结果。
【问题讨论】:
-
你试过了吗?为什么不设置一个快速基准并找出答案?
-
正如我们所说的那样,用我的硬件填充 1000 万条记录需要一些时间 :)
-
确保在测试中选择 SQL_NO_CACHE
-
您可以将两个值存储在 2 列中,int 将具有索引,而 datetime 将用于显示目的。如果这不是一个选项,则将日期存储在 datetime 类型中。
-
@DavidKuridža 性能是因为 io 绑定而不是 cpu 绑定。因此,如果您同时使用这两种字段类型,则会存储更多数据,这就是执行时间相同的原因。