2011-09-29 94 views
1

查詢:MySQL的子查詢優化

SELECT a FROM table1 WHERE b IN (SELECT b FROM table1 WHERE c = 2); 

如果子查詢返回結果爲零,MySQL的需要很長的時間來實現它,它最終會返回一個空的結果之前。 (子查詢爲空時爲2.5s,子查詢結果爲0.0005s)。

我的問題:有沒有辦法修改查詢,使它仍然會返回一個空的結果,但採取與結果時一樣的時間?

我想:

SELECT a FROM table1 WHERE b IN ((SELECT b FROM table1 WHERE c = 2), 555); 

...但它只能當子查詢爲空。如果有結果,查詢失敗。

- 我不想改變查詢格式從嵌套到加入/ etc。

想法..?謝謝!

- 編輯:此外,我忘了補充:子查詢可能會導致一個體面的結果列表,而不僅僅是一個結果。 ---另外,當我輸入「555」時,我指的是在列中不會存在的值。

- 編輯2:我也嘗試下面的查詢和它「作品」,但它仍然需要幾個數量級長於當它有結果原始查詢:

SELECT a FROM table1 WHERE b IN (SELECT 555 AS b UNION SELECT b FROM table1 WHERE c = 2); 

回答

2

胡亂猜測(我可以現在不試驗):

SELECT a FROM table1 WHERE 
EXISTS (SELECT b FROM table1 WHERE c = 2) 
AND b IN (SELECT b FROM table1 WHERE c = 2); 
+0

啊,非常好的想法。這同樣適用,但不幸的是,它仍然會遇到與我的[編輯2]嘗試相同的問題:當它有結果時,它比原始查詢的時間要長几個數量級。 – Lucas

+0

@盧卡斯 - 很奇怪。在沒有數據返回的情況下單獨運行內部查詢的時間也會長得多?加 - 是b索引在table1中,並被c編入索引? – Galz

+0

確實很奇怪!是的,當一個值不存在時,單獨運行內部查詢具有相同的通脹時間。是的,所有3列都是單獨索引的。 - 側面說明:我喜歡你的查詢比我的[編輯2]查詢更好,所以如果沒有別的,我肯定會使用它,並承受通貨膨脹的時間。 – Lucas