我是个MySQL新手,在涉及多表查询时,喜欢使用子查询,简单易懂。
SELECT * FROM *** WHERE id IN (SELECT ***);
但也发现很多人用JOIN同样能实现查询结果,我想知道JOIN相比子查询,在性能方面有什么优势吗? 我该如何理解JOIN语句呢?
JOIN
认证0级讲师
對於mysql,從來都不推薦使用子查詢和join。因為本身join的效率就是硬傷,一旦數據量上去效率很難保證,強烈推薦分別根據索引單表取數據,然後在程序裏麵做join,merge數據。
如 stackoverflow 上所述。http://stackoverflow.com/questions/38...
已接受 7 票反對
我希望第一個查詢會更快,主要是因為您有一個等價項和一個顯式 JOIN。根據我的經驗,IN 是一個非常慢的運算符,因為 SQL 通常將其計算為一係列由“OR”分隔的 WHERE 子句(WHERE x=Y OR x=Z OR...)。
與 ALL THINGS SQL 一樣,您的情況可能會有所不同。速度在很大程度上取決於索引(你的兩個 ID 列上都有索引嗎?這會有很大幫助......)。
100% 確定哪個更快的唯一真正方法是打開性能跟蹤(IO 統計信息特別有用)並運行它們。確保在運行之間清除緩存!
我沒有仔細了解過其中的差異,不過對於數據比較少(壓力不大)的情況,兩種都是可用的,估計性能差不了多少;對於數據量大的情況下,JOIN和子查詢都是不可接受的,需要額外的優化(比如用nosql做緩存什麼的)。
我覺得小數據量無所謂,大數據量又不會用這種辦法了。
小數據量無所謂,大數據量下還是極力避免吧。
http://chaous.com/MySQL/2012/03/27/my...
關於MySQL IN運算之前寫過一篇文章,希望對LZ有用。
至於怎麼理解JOIN查詢,推薦LZ一本書 http://book.douban.com/subject/105696...
具體性能我不清楚。不過我看別人說,是用join代替子查詢。
子查詢就別用了,效率太差,如果是JOIN的話,它是走嵌套查詢的。小表驅動大表,且通過索引字段進行關聯。如果表記錄比較少的話,還是OK的。大的話業務邏輯中可以控製處理。
通常用join 如果是做分析就用join
對於mysql,從來都不推薦使用子查詢和join。因為本身join的效率就是硬傷,一旦數據量上去效率很難保證,強烈推薦分別根據索引單表取數據,然後在程序裏麵做join,merge數據。
如 stackoverflow 上所述。http://stackoverflow.com/questions/38...
已接受 7 票反對
我希望第一個查詢會更快,主要是因為您有一個等價項和一個顯式 JOIN。根據我的經驗,IN 是一個非常慢的運算符,因為 SQL 通常將其計算為一係列由“OR”分隔的 WHERE 子句(WHERE x=Y OR x=Z OR...)。
與 ALL THINGS SQL 一樣,您的情況可能會有所不同。速度在很大程度上取決於索引(你的兩個 ID 列上都有索引嗎?這會有很大幫助......)。
100% 確定哪個更快的唯一真正方法是打開性能跟蹤(IO 統計信息特別有用)並運行它們。確保在運行之間清除緩存!
我沒有仔細了解過其中的差異,不過對於數據比較少(壓力不大)的情況,兩種都是可用的,估計性能差不了多少;對於數據量大的情況下,JOIN和子查詢都是不可接受的,需要額外的優化(比如用nosql做緩存什麼的)。
我覺得小數據量無所謂,大數據量又不會用這種辦法了。
小數據量無所謂,大數據量下還是極力避免吧。
http://chaous.com/MySQL/2012/03/27/my...
關於MySQL IN運算之前寫過一篇文章,希望對LZ有用。
至於怎麼理解JOIN查詢,推薦LZ一本書 http://book.douban.com/subject/105696...
具體性能我不清楚。不過我看別人說,是用join代替子查詢。
子查詢就別用了,效率太差,如果是JOIN的話,它是走嵌套查詢的。小表驅動大表,且通過索引字段進行關聯。如果表記錄比較少的話,還是OK的。大的話業務邏輯中可以控製處理。
通常用join
如果是做分析就用join