日期字段的Mysql索引

日期字段的Mysql索引,mysql,performance,date,indexing,Mysql,Performance,Date,Indexing,我有一个datetime列,我必须按日期筛选,并按天或月对其进行分组。这是一张百万行的表格 |IssueDate | -------------------- |2015-11-24 16:46:00| 这是没有任何索引的首选,因为我必须始终使用日期函数: select * from myTable where DATE(IssueDate)='2015-11-24' select * from myTable group by DATE(IssueDate) select

我有一个datetime列,我必须按日期筛选,并按天或月对其进行分组。这是一张百万行的表格

|IssueDate          |
--------------------
|2015-11-24 16:46:00|
这是没有任何索引的首选,因为我必须始终使用日期函数:

select * from myTable where DATE(IssueDate)='2015-11-24'
select * from myTable group by DATE(IssueDate)
select * from myTable group by YEAR(IssueDate), MONTH(IssueDate)
这是第二个选项,用于在表中分隔时间和日期:

|IssueDate |Issuetime|
----------------------
|2015-11-24|16:46:00 |
在这里,我可以为日期字段编制索引:

select * from myTable where IssueDate='2015-11-24'
select * from myTable group by IssueDate
select * from myTable group by YEAR(IssueDate), MONTH(IssueDate)
另一次尝试冗余fest:

|IssueDate |Issuetime|IssueMonth|IssueYear|
-------------------------------------------
|2015-11-24|16:46:00 |11        |2015     |
在这里,我可以为所有字段编制索引:

select * from myTable where IssueDate='2015-11-24'
select * from myTable group by IssueDate
select * from myTable group by IssueYear, IssueMonth

为了获得最佳性能,如何对此进行索引?

问题的一部分是编写查询,以便它们可以使用索引

而不是写:

select *
from myTable
where DATE(IssueDate) = '2015-11-24';
尝试:

选择*
从myTable
其中发布日期>='2015-11-24'和发布日期<'2015-11-25';

其他两个示例使用
分组方式
。我发现要让MySQL在查询中使用索引进行聚合非常困难。

通过“非常困难”,您可以阅读:它只适用于具有特定连接的最小值和最大值,以及在哪里…如果我需要查找(而不是组)按月份和年份,我认为这应该与您建议的日期相同:其中发布日期>='2015-11-01'和发布日期<'2015-11-30'@Tobia是的,
datetime
上的单个索引足以进行过滤。将日期部分与时间部分分开有什么好处(在这些情况下或任何其他情况下)?例如,如果我只需要一个相等的筛选器(date='2015-11-24'),而不是筛选器之间的筛选器(IssueDate>='2015-11-24'和IssueDate<'2015-11-25'),我更喜欢以下模式:
d>='2015-11-24'和d<'2015-11-24'+间隔1天
。它避免了各种各样的问题,比如闰年。(请注意,@Tobia solution意外地未能包括11月的最后一天。)
select *
from myTable
where IssueDate >= '2015-11-24' AND IssueDate < '2015-11-25';