MySQL连接性能非常慢

MySQL连接性能非常慢,mysql,performance,join,Mysql,Performance,Join,我试图将值与超过1000000行的同一个表进行比较。下面是我的查询,大约需要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 (bu

我试图将值与超过1000000行的同一个表进行比较。下面是我的查询,大约需要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
你能帮我改进一下这个查询以获得足够快的结果吗? 这里的问题是,即使我有number和load_number索引,查询也不使用它。我不知道为什么它总是被忽视


谢谢。

首先,你有一个愚蠢的问题。您正在检索六列,但只有三个值。请看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)
对于此查询,您需要platformDescription、platformid和testlogbuildnumber、platformid和TTETID上的索引。

问题1: 在选择。。。优化非常差。子查询将一次又一次地重新运行。看起来您正期待从该查询中得到一个id;如果是,请将其更改为=选择。这样它将只运行一次

问题2:

FROM ( SELECT ... )
JOIN ( SELECT ... ) ON ...
优化效果很差,因为两个子查询都没有。你能像Gordon那样把两个子查询合并成一个吗?如果没有,则将其中一个放在临时表中,并向该表添加适当的索引,以便ON能够使用它。可能是主键studyid、load_number、number


注:MySQL的最新版本通过动态生成索引对这些问题进行了改进。您使用的是什么版本?

1似乎不需要两个子查询。把所有的表连接在一起。2不要在MySQL中使用速度非常慢的应用程序。改用join。3在子查询中不要使用*。谢谢你的评论,我对所有表都使用了联接,但更糟糕的是..如果我通过电子邮件发送给你,你能玩这个表吗?你的选择太荒谬了。您正在选择六列,但根据on子句,只有三个值。您可以先尝试答案。如果问题仍然存在,请告诉我们。是的,问题仍然存在。。我弄不明白。谢谢你的评论,我试图做的实际上是从t表中检索版本号1031719的所有值,还检索另一个版本号1030716的所有值,然后比较这些值。因为基于不同的构建编号,所有值都不同。选择a.studyid、a.number、a.加速度、a.applicated\u力、a.MPC\u力、a.SPC\u力、a.TRANSLATION、a.VELOCITY、a.load\u编号、b.studyid、b.number、b.ACCELERATION、b.applicated\u力、b.INTERNAL\u力、b.MPC\u力、b.SPC\u力、b.TRANSLATION、b.VELOCITY、,b、 加载编号这是完整的选择部分。感谢您的评论。我想知道,一旦我创建了一个临时表,那么我是否需要将一个表与临时表连接起来?或者如何使用Select语句应用临时表?你能给我解释一下吗?创建临时表xx主键。。。选择然后选择从选择..另一个子查询。。。于…加入xx。。3个字段。。等