mysql - 应该在此处索引哪些键以使此查询最佳

标签 mysql datetime indexing query-optimization

我有一个如下所示的查询:

SELECT * from foo
  WHERE days >= DATEDIFF(CURDATE(), last_day)

在这种情况下,days 是一个 INTlast_day 是一个 DATE 列。

所以我需要为 dayslast_day 设置两个单独的索引?

最佳答案

这个查询谓词,days >= DATEDIFF(CURDATE(), last_day) , 本质上不是 sargeable .

如果您保留当前的表设计,您可能会受益于 (last_day, days) 上的复合索引.然而,满足查询需要对该索引进行全面扫描。

这些列之一或两者上的单列索引对于提高此查询的性能将毫无用处或更糟。

如果您必须让这个查询执行得很好,您需要稍微重组一下您的表。让我们弄清楚。看起来您正在尝试排除“过期”记录:您想要 expiration_date < CURDATE() . 那是一个可搜索的搜索谓词。

因此,如果您添加了一个新列 expiration_date到您的表,然后按如下方式设置:

 UPDATE foo SET expiration_date = last_day + INTERVAL days DAY

然后对其进行索引,您将获得性能良好的查询。

关于mysql - 应该在此处索引哪些键以使此查询最佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38234601/

相关文章:

php - 我可以在 PHP 中混合使用 MySQL API 吗?

java - 克隆 java.time.LocalDateTime 的最佳方法

来自 ISO8601 时间戳字符串的 Django 模型 DateTimeField

python - pandas.concat : Cannot handle a non-unique multi-index! Pandas Python

java - 索引越界异常错误

mysql - 通过 MySQL 上的 EXPLAIN 查询分析需要改进的内容

Java - 找不到 hibernate.cfg.xml 文件

mysql - 带复合键数据库表的 w2ui Grid

Python 无法检查某个值是否在列表中

asp.net-mvc - 如何将索引应用于 IEnumerable 表达式类型并在 razor View 中并排显示数据