【问题标题】:How to optimize query with date calculation如何使用日期计算优化查询
【发布时间】:2013-11-09 17:33:52
【问题描述】:

这是我的表结构(大约一百万条记录):

我需要在某些日期选择一些索引,但只有年和月是相关的:

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。

如何优化/改进这个查询?

谢谢!

更新:解释报告:

【问题讨论】:

    标签: mysql query-optimization


    【解决方案1】:

    当您对将通过使用诸如MONTHYEAR 之类的函数进行索引的字段应用转换时,您可能会使索引的使用无效。 你可以:

    • 以不同的方式编写WHERE 子句,使其不使用MONTHYEAR 函数,例如:

      date >= '2003-03-01' 和 date

    编辑:刚刚意识到您可能在此表上没有任何索引。考虑为index_namedatetime_period 字段添加索引。

    【讨论】:

    • MySQL 与 Oracle 不同,不支持基于函数的索引。因此,重写WHERE 条件使其不对date 列应用任何函数是唯一的选择。
    • 我确实有两个键(index_id、date 和 time_period)和(index_name、date 和 time_period)。它没有任何区别。我注意到将查询字符串从“index_name='MSCI EAFE Mid NR USD'...”更改为“index_id='FAWER45QS'”将性能从 1 秒提高到 0.045 秒。仍在寻找更好的建议。
    • 您能否发布查询的说明,以便我们查看它选择使用哪些索引
    • 添加了解释报告。
    • 您是否尝试过我删除 MONTH 和 YEAR 函数的建议?除非你这样做,否则你永远不会让它使用你的索引。
    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2016-07-23
    • 2021-07-06
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多