MySQL Left Join 运行速度非常慢,拆分为 2 个查询要快得多

Posted

技术标签:

【中文标题】MySQL Left Join 运行速度非常慢,拆分为 2 个查询要快得多【英文标题】:MySQL Left Join running very slow, splitting into 2 queries is much faster 【发布时间】:2013-03-14 18:49:58 【问题描述】:

当我使用 LEFT JOIN 运行查询时,需要 20 秒。当我将它分成 2 个查询时,它会在 4 秒内运行。但是,正如您可以想象的那样,这使得以特定顺序显示结果变得非常困难。 我的初始查询有什么问题,我可以将 2 合并为 1 吗?

Table1 有 ~400,000 行,Table2 有 ~200,000 行。

Field3Table2中的主键,在Table1中被索引。

查询返回大约 ~100k 行。

SELECT Table1.Field1, Table2.Field4
FROM
    Table1
    LEFT JOIN
        Table2 USING (Field3)
WHERE Table1.Field1 = 'Example'

当我按照书面方式运行查询时,平均需要 20 秒才能运行。但是,如果我在没有 LEFT JOIN 的情况下运行查询,并运行第二个查询来获取该数据,那么所有的运行总共需要大约 4 秒。

SELECT Table1.Field1, Table1.Field3
FROM Table1
WHERE Table1.Field1 = 'Example'

//php
$first = true;
while ($row = mysql_fetch_assoc($query))

    if (!$first)
    
        $field3Values .= ",";   
    
    $field3Values .= "'" . mysql_real_escape_string($row['Field3']) . "'";  
    $first = false;


//Now run the 2nd query
SELECT Field4
FROM People
WHERE Field3 IN (" . $field3Values . ")

编辑:根据要求,第一个查询中的EXPLAIN

【问题讨论】:

您是否尝试过 ON 而不是 USING? @raheelshan 是的,没有什么不同。 table1 是否被Field1 索引? 请发布单个查询的EXPLAIN @G-Nugget 不确定这有什么帮助,但我将其添加到问题中 【参考方案1】:

约翰和我在一次聊天中发现了这一点。单个查询很慢,因为查询优化器没有为Table1 选择一个好的索引。通过将FORCE INDEX (Field1) 添加到查询中,Table1.Field1 上的索引用于过滤结果,而不是进行全表扫描。我们不完全确定为什么这两种查询方法运行得更快,但我的猜测是,由于某种原因,查询优化器在第一个单个查询中使用索引,而不是在单个查询中。

【讨论】:

以上是关于MySQL Left Join 运行速度非常慢,拆分为 2 个查询要快得多的主要内容,如果未能解决你的问题,请参考以下文章

Mysql left join with nested select慢,如何优化

MySQL Left Join(左连接) 耗时严重的问题

MySQL LEFT JOIN 或 WHERE IN SUBQUERY

mysql 优化慢复杂sql (多个left join 数量过大 order by 巨慢)

使用 VIEW 和 LEFT OUTER JOIN 进行慢查询

JOIN 慢查询