2016-08-23 132 views
0

我有一个嵌套的MySQL查询在表中有超过500000条记录的关系。该查询需要60秒才能获取结果,并且索引编制已在所有表中完成。减少嵌套mysql查询的时间

请建议减少执行时间。提前致谢。

SELECT t1.col1,t1.col2 
    FROM table1 AS t1 
    WHERE t1.col2 IN 
    (
     SELECT DISTINCT(t2.col1) FROM table2 AS t2 WHERE t2.col2 IN 
     (
      SELECT t3.col1 
      FROM table3 AS t3 
      WHERE t3.col2 = '04' ORDER BY t3.col1 ASC 
     ) 
     ORDER BY t2.col1 ASC 
    ) 
+0

为什么要使用排序??? – apomene

+0

其要求 – DevOps

+2

您只应订购最终结果集。尝试分析查询以查看导致执行时间过长的原因;这很可能是你的“DISTINCT”条款,因为它们往往会造成延误。另外,您可以尝试使用'JOIN'而不是'WHERE ... IN',因为这通常会更快。 –

回答

2

IN子句进行全表扫描。我相信,如果你使用inner join,就像你将有更好的性能:

SELECT t1.col1,t1.col2 
    FROM table1 AS t1 
INNER JOIN table2 t2 
    ON t1.col2=t2.col1 
INNER JOIN table3 t3 
    ON t2.col1=t3.col1 
WHERE t3.col2 = '04' 
ORDER BY t3.col1 ASC,t2.col1 ASC 
+1

嵌套select查询总是很慢并且很重,因为它们将中间数据存储在内存中。将你的嵌套查询切换到一个连接(如@apomene所示),它将防止内存负载并提高执行速度。 – deniskoronets

+0

感谢它的魅力。 – DevOps

3

我先前的评论是:

您应该只为了你的最终结果集。尝试分析查询 以查看导致执行时间过长的原因;这很可能是因为它们通常会导致延迟而导致的DISTINCT子句。此外, 您可以尝试使用JOIN而不是WHERE ... IN,因为通常可以使用更快的 。

没有测试的代码,但继我意见的前面,使用JOIN S也是一样的查询将类似于:

SELECT t1.col1, 
     t1.col2 
    FROM table1 t1 
    INNER JOIN table2 t2 ON t2.col1 = t1.col2 
    INNER JOIN table3 t3 ON t3.col1 = t2.col2 
    WHERE t3.col2 = '04' 
    ORDER BY t2.col1, t3.col1 

我希望这样的查询执行比使用WHERE ... IN显著更快。

+0

是的,你肯定是对的......谢谢J – DevOps

0

您还可以使用EXISTS条件像

Select t1.col1,t1.col2 FROM table1 AS t1 WHERE EXISTS (
Select t2.col1 FROM table2 as t2 where EXISTS (
    Select t3.col1 FROM table3 AS t3 where t3.col2 = '04' and t2.col2=t3.col1 
) and t1.col2=t2.col1)