【问题标题】:Reduce time in nested mysql query减少嵌套 mysql 查询的时间
【发布时间】:2016-08-23 21:03:00
【问题描述】:

我有一个嵌套的 MySQL 查询,它在每个表中有超过 500000 条记录的表中存在关系。查询需要 60 秒才能获取结果,并且已在所有表中完成索引。

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

    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
    )

【问题讨论】:

  • 你为什么要使用排序???
  • 您应该只订购您的最终结果集。尝试分析查询以查看导致执行时间长的原因;很可能是您拥有的DISTINCT 子句,因为它们通常会导致延迟。此外,您可以尝试使用JOIN 而不是WHERE ... IN,因为这通常会更快。
  • 支持@MartinParkin,您应该能够轻松地重写查询以使用连接而不是where...in

标签: mysql


【解决方案1】:

我之前的评论是:

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

未经测试的代码,但根据我之前的评论,使用JOINs 的相同查询看起来类似于:

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 执行得快得多。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 嵌套选择查询总是缓慢而繁重,因为它们将中间数据存储在内存中。将您的嵌套查询切换为连接(如 @apomene 所示),它将防止内存负载并提高执行速度。
    【解决方案3】:

    您也可以使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多