MySQL加入性能真的很慢

时间:2015-06-11 00:34:10

标签: mysql performance join

我正在尝试将值与具有超过1,000,000行的同一个表进行比较。以下是我的查询,获得结果大约需要25秒。

EXPLAIN SELECT DISTINCT a.studyid,a.number,a.load_number,b.studyid,b.number,b.load_number FROM
(SELECT t1.*, buildnumber,platformid FROM t t1
INNER JOIN testlog t2 ON t1.`testid` = t2.`testid`
WHERE (buildnumber =1031719 AND platformid IN (SELECT platformid FROM platform WHERE platform.`Description` = "Windows 7 SP1"))
)AS a
JOIN
(SELECT t1.*,buildnumber,platformid FROM t t1
INNER JOIN testlog t2 ON t1.`testid` = t2.`testid`
WHERE (buildnumber =1030716 AND platformid IN (SELECT platformid FROM platform WHERE platform.`Description` = "Windows 7 SP1"))
)AS b
ON a.studyid=b.studyid AND a.load_number = b.load_number AND a.number = b.number

enter image description here

enter image description here

你能帮助我改进这个查询以获得足够快的结果吗? 这里的问题是即使我有number和load_number索引,查询也没有使用它。我不知道为什么它总是被忽略..

感谢。

2 个答案:

答案 0 :(得分:0)

首先,你有一个愚蠢的查询。您正在检索六列,但只有三个值。查看polylist = [(arglist[i],arglist[i+1]) for i in xrange(0,len(arglist),2)] 子句。

我认为最好的办法是使用条件聚合重写查询。我认为以下内容是等效的:

on

对于此查询,您需要SELECT t1.studyid, t1.load_number, t1.number FROM t t1 INNER JOIN testlog t2 ON t1.testid = t2.testid WHERE t2.buildnumber IN (1031719, 1030716) AND platformid IN (SELECT platformid FROM platform p WHERE p.Description = 'Windows 7 SP1')) GROUP BY studyid, load_number, number HAVING MIN(buildnumber) <> MAX(buildnumber) platform(Description, platformid)以及testlog(buildnumber, platformid)上的索引。

答案 1 :(得分:0)

问题#1:
IN ( SELECT ... )优化非常。子查询一次又一次地重新运行。看起来您期望该查询中只有一个id;如果是,请将其更改为= ( SELECT ... )。这样它将只运行一次。

问题#2:

FROM ( SELECT ... )
JOIN ( SELECT ... ) ON ...

因为没有子查询而优化得很差。正如戈登试图的那样,你能将两个子查询合并成一个吗?如果没有,则将其中一个放入TEMPORARY TABLE并为该表添加适当的索引,以便ON能够使用它。可能是PRIMARY KEY(studyid, load_number, number)

脚注:最新版本的MySQL通过动态生成索引来改进这些问题。你用的是哪个版本?