这是我的表结构(大约100万条记录):
我需要在特定日期选择一些索引,但只有年份和月份相关:
SELECT `index_name`,`results` FROM `mst_ind` WHERE
((`index_name`='MSCI EAFE Mid NR USD' AND MONTH(`date`) = 3 AND YEAR(`date`) = 2003) OR
(`index_name`='MSCI Morocco PR USD' AND MONTH(`date`) = 3 AND YEAR(`date`) = 2003))
AND `time_period`='M1'
它工作正常,但性能很糟糕。我通过探查器运行查询,但它无法建议任何可能的键。
主键包含index_id、date和time_period。
如何优化/改进此查询?
谢谢!
更新:解释报告:
最佳答案
当您对将使用诸如 MONTH
和 YEAR
等函数建立索引的字段应用转换时,您可能会使索引的使用无效。
你可以:
以不同方式编写
WHERE
子句,使其不使用MONTH
和YEAR
函数,例如:日期
>= '2003-03-01' 和日期
<'2003-04-01'
编辑:刚刚意识到您可能在此表上没有任何索引。考虑向 index_name
、date
和 time_period
字段添加索引。
关于mysql - 如何优化带有日期计算的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852510/