我有下表,大约有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 | |
+----------------+--------------+------+-----+---------+-------+
在以下方面性能会有显着提升:
Day_create
类型的新列DATE
,(不是DATETIME)并且在此列上有索引。相反:
Date_create
类型的DATETIME
列上添加索引。答案 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 DAY
,36 HOUR
,2 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
进行比较,这都适用。
如果您需要进一步讨论,请提供您需要讨论的查询/查询。 (可能需要其他索引;单日和日间范围可能有所不同,等等)