当我使用LEFT JOIN
运行查询时,需要20秒。当我将它分成2个查询时,它会在4秒内运行。但是,正如您可以想象的那样,这使得以特定顺序显示结果变得非常困难。 我的初始查询有什么问题,我可以将2合并为1吗?
Table1
有大约400,000行,Table2有大约200,000行。
Field3
是Table2
中的主键,并在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
:
答案 0 :(得分:1)
约翰和我在聊天中发现了这一点。单个查询很慢,因为查询优化器没有为Table1
选择一个好的索引。通过向查询添加FORCE INDEX (Field1)
,Table1.Field1
上的索引用于过滤结果,而不是执行全表扫描。我们不完全确定为什么这两种查询方法运行得更快,但我的猜测是,由于某种原因,查询优化器在第一个单个查询中使用了索引,但没有在单个查询中使用。