2017-07-20 221 views
0

所以,我剛剛開始了一個新的mySQL數據庫,它有兩個主表,bigTable [600,000行]和lilTable [8000行]。有一個字段blId鏈接表,這些表已被索引在bigTable中。極慢嵌套mySQL查詢

我想從bigTable中選擇與lilTable中符合特定條件的任何條目共享blId的所有條目,但我不需要該表中的任何其他信息,因此連接似乎過多。

事不宜遲,這裏是我的非常慢查詢:

SELECT * FROM testdb.bigTable where blId in 
(SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue'); 

這需要〜52秒跑在我的電腦,上,仍然需要50秒的時候,內部查詢返回0的結果!相反,如果我單獨運行內部查詢並手動創建一個可接受的blId的列表,該列表代替了子查詢,它將在不到十分之一秒的時間內運行。藍色火焰正在發生什麼?

編輯:所以我找到了一種方法來加速它,把它包裝在另一個冗餘的select語句中? (削減查詢時間下降到0.25秒)任何人都可以解釋這種行爲,這將不勝感激。

SELECT * FROM testdb.bigTable where blId in 
(SELECT * FROM 
    (SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue') AS why 
); 
+0

你必須在sql中使用'LIKE'嗎?如果你改成'color ='blue'',會更快嗎?請包括表結構。 –

+0

你有沒有在表格中定義的索引?桌子有多大?爲什麼使用Like? – ChuckCottrill

回答

1

嘗試使用exists代替:

SELECT bt.* 
FROM testdb.bigTable bt 
WHERE EXISTS (SELECT 1 
       FROM certtest.lilTable lt 
       WHERE lt.color LIKE 'blue' AND bt.blID = lt.blId 
      ); 

對於此查詢的目的,你要對lilTable(blId, color)的索引。

+1

速度基本一樣。 –

+0

@CarlShiles。 。 。你有指定的索引嗎? –

+0

我這樣做,但是我沒有在示例中包含它,因爲當將表達式嵌套到其他選擇中時,索引顯然不是問題,因此速度提高了100倍。我正在尋找可以解釋這種行爲的有經驗的人。 –