为两个大表增加MySQL JOIN的速度

Bri*_*ian 7 mysql

我必须在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)

Rol*_*man 8

像其他人指出的那样,你需要适当的索引.对于此特定查询,您可以从以下索引中受益:

(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(*) = 2HAVING COUNT(*) >= 2.看到评论(再次感谢,BenoKrapo)

编辑:发布这个答案后的几天,我发现这篇帖子来自Facebook的MySQL架构师Mark Callaghan:http://www.facebook.com/note.php? note_id = 243134480932从 本质上讲,他描述的是如何相似但不同的'聪明由于MySQL优化器错误,比较会带来极差的性能.所以我的观点是,当你受苦时尝试不用语法,你可能遇到了一个bug.