我必须在MySQL查询中加入大型表,这需要很长时间 - 大约180秒.有没有优化合并的提示?
我的桌子有10个字段.我只在查询中使用4 - 所有字符串.表有大约600,000行,结果应该有大约50行.
使用的四行是:标题,变量,位置,日期
这是我的查询:
SELECT DISTINCT t1.Title, t1.Variables FROM `MyTABLE` t1 JOIN `MyTABLE` t2
USING (Title, Variables)
WHERE (t1.Location, t1.Date) = ('Location1', 'Date1')
AND (t2.Location, t2.Date) = ('Location2', 'Date2')
Run Code Online (Sandbox Code Playgroud)
像其他人指出的那样,你需要适当的索引.对于此特定查询,您可以从以下索引中受益:
(Location, Date)或(Date, Location)(对于WHERE子句)和(Title, Variables)或(Variables, Title)(对于join条件,ON子句)
确切地知道位置,日期,标题和变量列的大小(即数据类型)将是有帮助的,因为大索引可能比小索引慢.
最后,只是一个提示:我不会像你一样使用花哨的比较结构.该
USING (Title, Variables)
Run Code Online (Sandbox Code Playgroud)
可能还可以,但我肯定会检查一下
(t1.Location, t1.Date) = ('Location1', 'Date1')
Run Code Online (Sandbox Code Playgroud)
和
(t2.Location, t2.Forecast_date) = ('Location2', 'Date2')
Run Code Online (Sandbox Code Playgroud)
表现得像你期望的那样.所以我肯定会继续EXPLAIN使用它,并将输出与"常规"旧式比较进行比较,如下所示:
t1.Location = 'Location1'
AND t1.Date = 'Date1'
AND t2.Location = 'Location2'
AND t2.Forecast_date = 'Date2'
Run Code Online (Sandbox Code Playgroud)
你可以在逻辑上论证,它是相同的,它应该无关紧要 - 你是对的.但话说回来,MySQL的优化器并不是很聪明,并且总是存在错误的可能性,特别是对于没有经常使用的功能.我认为这是一个特色.所以我至少会尝试解析,看看这些替代符号是否被评估相同.
但是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
Run Code Online (Sandbox Code Playgroud)
编辑:我改HAVING COUNT(*) = 2到HAVING COUNT(*) >= 2.看到评论(再次感谢,BenoKrapo)
编辑:发布这个答案后的几天,我发现这篇帖子来自Facebook的MySQL架构师Mark Callaghan:http://www.facebook.com/note.php? note_id = 243134480932从 本质上讲,他描述的是如何相似但不同的'聪明由于MySQL优化器错误,比较会带来极差的性能.所以我的观点是,当你受苦时尝试不用语法,你可能遇到了一个bug.