【问题标题】:MySQL Integer vs DateTime indexMySQL 整数与日期时间索引
【发布时间】:2011-06-03 09:56:16
【问题描述】:

首先让我说我看过许多类似的问题,但它们都与TimestampDateTime 字段类型相关,没有索引。至少这是我的理解。

众所周知,DateTime 有一定的优势。把它们放在一边,假设表的引擎是InnoDB10+ million records,当条件基于时,哪个查询会执行得更快:

  1. 带索引的日期时间
  2. 带索引的整数

换句话说,最好将日期和时间存储为DateTimeint 中的UNIX 时间戳?请记住,不需要使用任何内置的 MySQL 函数。

更新

使用 MySQL 5.1.41(64 位)和 1000 万条记录进行测试,初始测试显示速度差异显着,有利于 int。使用了两个表,tbl_dtDateTimetbl_intint 列。结果很少:

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 绑定。因此,如果您同时使用这两种字段类型,则会存储更多数据,这就是执行时间相同的原因。

标签: mysql indexing innodb


【解决方案1】:

我看到test mentioned in the above answer中,作者基本证明,当UNIX time提前计算时,INT获胜。

【讨论】:

    【解决方案2】:

    我的直觉是整数总是更快。不过好像不是这样的

    http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/

    编辑添加:我意识到您使用的是 InnoDB,而不是 MyISAM,但在 InnoDB 案例中我没有发现任何与此相矛盾的东西。此外,同一作者进行了 InnoDB 测试

    http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-innodb/

    【讨论】:

    • 仅仅因为他使用了`WHERE datetime > UNIX_TIMESTAMP('1970-01-01 01:30:00') AND datetime
    【解决方案3】:

    这取决于您的应用程序,正如您在MySQL Date Format: What Datatype Should You Use? We Compare Datetime, Timestamp and INT. Mysql 服务器中的 DATETIME 、 TIMESTAMP 和 INT 类型的出色比较和基准测试中看到的那样,您可以看到在某些情况下 INT 具有比其他更好的性能,在某些情况下 DATETIME有更好的表现。 这完全取决于您的应用程序

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2011-04-30
      相关资源
      最近更新 更多