【发布时间】:2018-05-06 17:57:00
【问题描述】:
我有这个问题:
SELECT * FROM dwDimDate d
LEFT JOIN tickets t FORCE INDEX FOR JOIN (idx_tickets_id_and_date) ON
DATE_FORMAT(t.ticket_date, '%Y%m%d') = d.date_key
LEFT JOIN sales s ON s.ticket_id = t.ticket_id
WHERE d.date_key BETWEEN 20130101 AND 20131231
GROUP BY d.date_key
我正在寻求帮助来优化它。我一直在阅读所有我能理解的解释计划,并以此为基础进行优化,但我似乎无法阻止 MySQL 在门票表上使用 ALL 类型查找。
索引:
解释计划:
我尝试使用 FORCE INDEX FOR JOIN 来尝试让它索引日期,但它似乎没有得到提示。
dwDimDate 是一年中的日期维度,因此在这种情况下,我认为限制为 365 天会很快,然后找到该日期范围内的所有票。在该日期范围内应该只有大约 5000 张票。
任何帮助将不胜感激。我不知道如何弄清楚要采用什么策略来删除“ALL”查找。我想知道以后怎么做,所以如果你能帮助“教我钓鱼”,那就太好了。
编辑 该查询目前需要 11 秒才能运行,这在生产中将是一个问题。
【问题讨论】:
-
你真的需要
LEFT吗? -
这是不正确的格式 - 当给定日期有多个票时,应该传递来自
tickets的哪些值??
标签: mysql sql-execution-plan explain