我有一个日期时间列,我必须按日期过滤并按天或月分组。这是一个百万行表。
|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)
另一次尝试冗余节目:
|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
为最佳效果索引此内容的方式是什么?
答案 0 :(得分:1)
您的部分问题是编写查询,以便他们可以使用索引。
而不是写作:
select *
from myTable
where DATE(IssueDate) = '2015-11-24';
尝试:
select *
from myTable
where IssueDate >= '2015-11-24' AND IssueDate < '2015-11-25';
您的其他两个示例使用group by
。我发现让MySQL在查询中使用索引进行聚合非常困难。