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

时间:2013-03-14 18:49:58

标签: mysql join query-optimization left-join

当我使用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 . ")

修改:根据要求,来自第一个查询的EXPLAINenter image description here

1 个答案:

答案 0 :(得分:1)

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