日期时间列的最佳索引

时间:2017-10-25 13:14:15

标签: mysql date datetime indexing

我有下表,大约有4亿行。我必须在此表上执行SELECT个查询,通常涉及WHERE列上的Date_create子句。

关键大多数我的查询是全天(不考虑小时和秒)

+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| ID_num         | bigint(45)   | NO   | PRI | NULL    |       |
| Content        | varchar(250) | YES  |     | NULL    |       |
| User_ID        | bigint(24)   | NO   | MUL | NULL    |       |
| Location       | varchar(70)  | YES  |     | NULL    |       |
| Date_create    | datetime     | NO   |     | NULL    |       |
+----------------+--------------+------+-----+---------+-------+

在以下方面性能会有显着提升:

  1. 创建一个Day_create类型的新列DATE,(不是DATETIME)并且在此列上有索引。
  2. 相反:

    1. Date_create类型的DATETIME列上添加索引。

2 个答案:

答案 0 :(得分:1)

你可以让Date_create上的索引运作良好,只要你接受here给出的建议并以最佳方式查询字段(不使用DATE()函数)。

通过这种方式,您可以获得两全其美的效果:快速SELECT查询,而且额外列无需额外存储空间。

答案 1 :(得分:0)

不,不要打扰额外的专栏。

但是要小心你如何制定查询。否则,查询可能无法使用索引。

WHERE Date_create >= '2017-02-01'
  AND Date_create  < '2017-02-01' + INTERVAL 1 MONTH

是一种简单,清晰,闰年,数据类型证明的方法,用于获取今年2月的所有行。 (其中的变体适用于1 DAY36 HOUR2 WEEK等。

您还没有说出WHERE子句的其余部分是什么样的。这也很重要,特别是对于400M行。例如,如果您想要昨天的位置'abcd'的数据:

WHERE Location = 'abcd'
  AND Date_create >= CURDATE() - INTERVAL 1 DAY
  AND Date_create  < CURDATE()

INDEX(Location, Date_create) -- in this order!

'2017-02-01''2017-02-01 00:00:00'是相同的值;我更喜欢前者,因为它更短。无论您是与DATETIME还是DATE进行比较,这都适用。

如果您需要进一步讨论,请提供您需要讨论的查询/查询。 (可能需要其他索引;单日和日间范围可能有所不同,等等)