2009-11-08 323 views
7

我,而從2個表執行選擇發現了一些奇怪:MySQL查詢選擇使用子選擇的時間太長

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正在做這樣的第一個查詢,需要比最後2個查詢分開更多的時間?它是從子查詢的結果中選擇某些內容的最佳解決方案嗎?

其他詳細信息:table_1約有。 9000行,table_2有90000行。

後,我從table_2加在column_2索引,第一個查詢了0.15秒。

+0

內部選擇有多少結果? – Dani 2009-11-08 14:18:38

+0

你可以發佈運行'EXPLAIN SELECT * FROM table_1 WHERE id IN(SELECT id_element FROM table_2 WHERE column_2 = 3103)''的結果。這將顯示MySQL正在使用的查詢計劃和索引。 – 2009-11-08 14:19:38

+0

@Dani帖子指出內部查詢返回2行。 – 2009-11-08 14:20:47

回答

7

也許查詢分析器評估每個行的子查詢。

嘗試與INNER JOIN代替子查詢,並看看是否能提高性能:

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

這工作正常; 〜0。2s – 2009-11-08 14:39:01

2

這在MySQL的前一個已知的bug爲版本6

解決方法,我發現是:

SELECT * FROM TABLE_1 WHERE ID IN(SELECT FROM id_element(SELECT id_element FROM TABLE_2 WHERE COLUMN_2 = 3103)爲q)

+1

你可以添加一個鏈接到錯誤細節? – aviv 2010-03-17 09:37:26

+0

這種解決方法在我的特定查詢中縮短了一段時間(50秒縮短到10秒,但兩個單獨的查詢仍然以組合.7秒 – scum 2010-06-23 16:40:10

0

我有同樣的問題。 我爲這些表添加了一個INDEX(猜測你已經擁有了)並使用了USE INDEX指令。在你的情況下,它應該看起來像這樣:

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

對我來說,它使事情變得更好。

+0

獲勝)是不是你的'id'字段自動增量?MySQL應該知道在不指定的情況下使用它它。 – 2010-03-17 20:30:30