MySQL整数索引与DateTime索引的区别

54

首先,我要说我查看了很多类似的问题,但它们都涉及到没有索引的TimestampDateTime字段类型。至少这是我的理解。

正如我们所知道的那样,DateTime具有某些优点。暂且不提它们,并假设表的引擎为InnoDB,记录数为1000万。在基于以下条件的查询中,哪个查询会更快:

  1. 带有索引的DateTime
  2. 带有索引的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中存储相同值时找出差异。还没有找到任何关于这个主题的文档,因此只是个人观察。


你试过了吗?为什么不设置一个快速基准测试来找出答案呢? - ircmaxell
我们正在努力的过程中,用我的硬件填充1000万条记录需要一些时间 :) - David Kuridža
1
确保在测试中选择 SQL_NO_CACHE。 - coolgeek
1
你可以将这两个值存储在2列中,int类型会有索引,而datetime类型则用于显示目的。如果这不是一个选项,那么请将日期存储为datetime类型。 - shantanuo
@DavidKuridža,性能问题是因为I/O绑定而不是CPU绑定。因此,如果您同时使用这两种字段类型,您可以存储更多的数据,这就是相同执行时间的原因。 - iuridiniz
3个回答

11

我看到在上面提到的测试中,作者基本证明了当UNIX时间戳预先计算时,INT表现更好。


9

7
他在测试INT时在查询中使用了“WHERE datetime > UNIX_TIMESTAMP('1970-01-01 01:30:00') AND datetime < UNIX_TIMESTAMP('1970-01-01 01:35:00')”,这很有趣。 - OZ_
域名已过期/不存在,因此请使用缓存版本: myisam:https://web.archive.org/web/20191123065201/http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/ innodb:https://web.archive.org/web/20180207083623/http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-innodb/ - Vladimir Ch

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接