2017-03-09 84 views
-1
select sum(a) from tbl1 where id in (1,2,3) (0.1 seconds) 

這兩個mysql查詢的性能有什麼區別?

select sum(a) from tbl1 where id in (select id from tbl2) (60 seconds) 

select id from tbl2返回1,2,3 0.001秒;

tbl1大約有2.2M條目;

+1

臨時表中缺少索引。 – arkascha

+2

您可能想查看執行計劃,看看是否爲每個ID執行'(select id from tbl2)'而不是在開始時執行一次 –

+0

運行查詢'EXPLAIN select tbl1(sum)(a)where where id in(select id從tbl2)'併發布結果。 – nos

回答

0

這種情況發生在mysql < 5.5。似乎有一個導致查詢時間過長的錯誤。解決方案si在tmp2.id上添加索引或升級到更高版本的mysql。

0

(1,2,3)是代碼運行時已知的事情,而第二個示例是來自另一個表的查詢,後者需要更多的查詢是非常正常的。但是,600x慢度需要一些進一步的解釋。如果沒有你的情況的更多信息,我們只能猜測,但潛在的問題如下:

  • 有第二表中的許多IDS和多條記錄中的第一個表
  • 內部查詢每個運行外部查詢(很有可能)
  • 缺少你列的索引的記錄中使用過濾

如果內部查詢的結果應該是類似於第一個例子中的設置,那麼你可能要分開你的疑問分爲兩部分。您可以單獨加載標識,然後將結果用於第二個查詢。