使用子选择的MySQL查询选择花费的时间太长

时间:2009-11-08 14:15:31

标签: mysql optimization select

我从2个表中执行select时发现了一些奇怪的事情:

SELECT * FROM table_1 WHERE id IN (
    SELECT id_element FROM table_2 WHERE column_2=3103);

这个查询花了大约242秒。

但是当我执行子查询时

SELECT id_element FROM table_2 WHERE column_2=3103

花了不到0.002s(并产生了2行) 然后,当我做的时候

SELECT * FROM table_1 WHERE id IN (/* prev.result */)

它是相同的:0.002s。

我想知道为什么MySQL会像这样做第一个查询,比最后两个查询分别花费更多的时间?它是根据子查询结果选择内容的最佳解决方案吗?

其他详情:table_1约有。 9000行,table_2有90000行。

我从column_2添加table_2索引后,第一个查询占用了0.15秒。

3 个答案:

答案 0 :(得分:7)

查询分析器可能会评估每一行的子查询。

尝试使用INNER JOIN替换子查询,并查看是否可以提高性能:

SELECT     * 
FROM       table_1 t1
INNER JOIN table_2 t2
ON         t1.id = t2.id_element
           AND t2.column_2 = 3103

答案 1 :(得分:2)

这是ver 6之前的mysql中的一个已知错误。

我找到的工作是:

SELECT * FROM table_1 在哪里id IN(     SELECT id_element FROM(SELECT id_element FROM table_2 WHERE column_2 = 3103)为q)

答案 2 :(得分:0)

我有同样的问题。 我为表添加了一个INDEX(猜测你已经有)并使用了USE INDEX指令。在你的情况下,它应该是这样的:

SELECT * FROM table_1 USE INDEX(id)
WHERE id IN (SELECT id_element FROM table_2 WHERE column_2=3103);

对我而言,它让事情变得更好。