【问题标题】:MySQL Force Index on Joined Table - When Optimizer Selects from Joined Table First连接表上的 MySQL 强制索引 - 当优化器首先从连接表中选择时
【发布时间】:2023-03-09 05:53:01
【问题描述】:

我的查询如下所示:

SELECT columnA, columnB, ...
FROM tableA
JOIN tableB USING (columnX)
JOIN tableC USING (columnY)
WHERE
    tableC.columnZ = zzz AND
    tableA.columnA = aaa
GROUP BY ...

当我在这个查询上运行EXPLAIN 时,它显示查询优化器首先从tableC 中选择,但由于某种原因它不使用索引,即使我在tableC.columnZ 上有一个索引。

如何在此查询中强制使用tableC.columnZ?我试过了:

...
JOIN tableC USING (columnY) FORCE INDEX FOR JOIN (columnZ)
...

但这并没有强制使用该索引。

我也试过改变选择的顺序:

...
FROM tableC FORCE INDEX (columnZ)
JOIN tableA USING (columnY)
JOIN tableB USING (columnX)
...

这也没有用。

有关如何强制使用此索引的任何建议,或任何其他使此查询更快的建议?

注意:columnZDATETIME 列,WHERE 子句是: WHERE year(columnZ) = 2018 不知道这是否是根本原因?

【问题讨论】:

  • 也许问题出在 year(columnZ) 你试过硬编码日期字符串吗?
  • 是的,这就是问题所在。将尝试将日期硬编码为指定年份的 1 月 1 日并使用 >=

标签: mysql indexing force-index


【解决方案1】:

原来问题与原来的问题无关,是因为我在 where 子句中使用了一个函数。

将该子句更改为:

WHERE year(columnZ) = 2018

到:

WHERE columnZ >= '2018-01-01 00:00:00'

修复了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多