正如其他人指出的那样,您需要使用适当的索引。对于这个特定的查询,您可以从以下索引中受益:
(位置, 日期
) 或 (日期, 位置
) (用于 WHERE
子句)
和
(标题, 变量
) 或 (变量, 标题
) (用于连接条件, ON
子句)
了解位置、日期、标题和变量列的确切大小(即数据类型)将会很有帮助,因为大型索引往往比小型索引慢。
最后,给出一个提示: 我建议不要像您现在所做的那样使用花哨的比较结构。
USING (Title, Variables)
可能是可以的,但我肯定会检查一下
。
(t1.Location, t1.Date) = ('Location1', 'Date1')
并且
(t2.Location, t2.Forecast_date) = ('Location2', 'Date2')
你希望代码的表现符合预期。因此,我建议对其运行EXPLAIN
命令,并将输出与“传统”的比较方法进行比较,如下所示:
t1.Location = 'Location1'
AND t1.Date = 'Date1'
AND t2.Location = 'Location2'
AND t2.Forecast_date = 'Date2'
你可能会认为从逻辑上讲,这是相同的,不应该有影响 - 你是对的。但是,MySQL的优化器并不是非常聪明,特别是对于很少使用的功能,存在错误的可能性。我认为这就是这样一个功能。因此,我至少会尝试使用EXPLAIN,并查看这些替代符号是否被评估为相同。
但是,BenoKrapo指出,做这样的事情不是更容易吗:
SELECT Title, Variables
FROM MyTABLE
WHERE Location = 'Location1' AND Date = 'Date1'
OR Location = 'Location2' AND Date = 'Date2'
GROUP BY Title, Variables
HAVING COUNT(*) >= 2
编辑:我将HAVING COUNT(*) = 2
更改为HAVING COUNT(*) >= 2
。请参见评论(再次感谢BenoKrapo)
编辑:发布此答案几天后,我发现了来自Facebook的MySQL架构师Mark Callaghan的这篇文章:http://www.facebook.com/note.php?note_id=243134480932
基本上,他描述了由于MySQL优化器错误而导致类似但不同的“智能”比较表现糟糕的情况。所以我的观点是,在遇到问题时,请尝试简化语法,你可能已经碰到了一个bug。