mysql - 如何优化带有日期计算的查询

标签 mysql query-optimization

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

index table

我需要在特定日期选择一些索引,但只有年份和月份相关:

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。

如何优化/改进此查询?

谢谢!

更新:解释报告: enter image description here

最佳答案

当您对将使用诸如 MONTHYEAR 等函数建立索引的字段应用转换时,您可能会使索引的使用无效。 你可以:

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

    日期 >= '2003-03-01' 和日期 <'2003-04-01'

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

关于mysql - 如何优化带有日期计算的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852510/

相关文章:

mysql - 如何优化这个性能不佳的Mysql查询?

mysql - 改善MySQL SELECT性能

oracle - 执行SQL查询时出现ORA-03113

Java 数据库连接分为 2 个类

python - Scrapy编程错误: Not all parameters were used in the SQL statement

mysql - 根据表2的列值过滤表1的行,表1和表-2之间没有附件

MySQL,20 亿行数据,只读,性能优化?

ruby-on-rails - 使用本地哈希/数组更新许多记录的单个 Postgres 查询

php - 如何在 JOIN 语句中指定 WHERE?

mysql - Rails 添加大量记录的最佳方式