select sum(a) from tbl1 where id in (1,2,3) (0.1 seconds)
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條目;
select sum(a) from tbl1 where id in (1,2,3) (0.1 seconds)
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條目;
這種情況發生在mysql < 5.5。似乎有一個導致查詢時間過長的錯誤。解決方案si在tmp2.id上添加索引或升級到更高版本的mysql。
(1,2,3)
是代碼運行時已知的事情,而第二個示例是來自另一個表的查詢,後者需要更多的查詢是非常正常的。但是,600x慢度需要一些進一步的解釋。如果沒有你的情況的更多信息,我們只能猜測,但潛在的問題如下:
如果內部查詢的結果應該是類似於第一個例子中的設置,那麼你可能要分開你的疑問分爲兩部分。您可以單獨加載標識,然後將結果用於第二個查詢。
臨時表中缺少索引。 – arkascha
您可能想查看執行計劃,看看是否爲每個ID執行'(select id from tbl2)'而不是在開始時執行一次 –
運行查詢'EXPLAIN select tbl1(sum)(a)where where id in(select id從tbl2)'併發布結果。 – nos