簡體   English   中英

為什么單獨執行時此MySQL查詢速度更快?

[英]Why this MySQL query is faster when execute singly?

為什么查詢:

select sum(column_2) from table1 where column_1 in 
(select column_1 from table2 where column_3 = 'foo');

需要花費幾分鍾的時間來執行,所以如果我單獨執行兩個查詢會更快嗎?

例如:

select column_1 from table2 where column_3 = 'foo'結果為xxx

select sum(column_2) from table1 where column_1 in (xxx);

您應該避免嵌套查詢以提高性能,可以將其重寫為:

select sum(column_2) 
from table1  t1
inner join table2  t2
on t1.column_1 =  t2.column_1
where column_3 = 'foo';

引用MySQL文檔:

使用其中一些技術比使用子查詢可能更有效

例如,此查詢:

SELECT * FROM t1 id in(輸入id from t2);

可以改寫為:

選擇DISTINCT t1。*從t1,t2到t1.id = t2.id;

您問的是原因,而不是選擇如何使其更快。 簡短的答案是,這不是MySQL的查詢解析器得到很好優化的領域。 更簡單地說,MySQL中的子查詢性能是可悲的。

嚴格來說,這不是正確的,但是通過痛苦的學習經驗,大約90%的時間都是正確的。[1] [2] 在幾乎所有其他數據庫中,關系演算將盡可能減少子查詢,包括Oracle,PosgreSQL,SQL Server和SQLite(不是詳盡的列表,而是我經驗最豐富的數據庫)。 原因是關系理論的發展時間太長。

對於MySQL,這是一個“陷阱”區域,您在制定查詢時只需要了解該區域。 通常(並非總是如此),請嘗試避免子查詢。 使用JOIN,多個查詢以及任何有幫助的參考

對於查詢和數據集的特定幫助,請使用EXPLAIN運算符

EXPLAIN SELECT SUM(column_2) FROM table1 WHERE column_1 IN
     (SELECT column_1 FROM table2 WHERE column_3 = 'foo');

[1] MySQL限制第3部分:子查詢

[2]從2010年開始,子選擇的運行速度更快 (但分析不錯)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM