再談MySQL的子查詢優化技術

2021-07-28 11:17:20 字數 939 閱讀 5893

朋友說:

我這幾天看了子查詢的課程以及查閱了一些資料,給我的感受是

子查詢不怎麼好使,能不用就盡量不用,做過的專案很少採用子查詢,很多相關子查詢都可以上拉至連線查詢。

稍微用的多一點的可能就是in查詢了

答覆:---1 技術是通用的---通常都是上拉優化的思路,乙個概述可以參見:

---2 你這種感受, 可以從2個角度解釋:

---2.1 技術角度:從技術上看

---mysql的子查詢優化,有其獨到之處,主要表現在他把子查詢優化分為幾個階段(去不必要的冗餘子句、將in/all/any等型別的子查詢轉換為min/max等操作,對多種形式的子查詢進行支援如in、any、exists等,把子查詢表示為物化形式或半連線以及在後期的多種半連線消重策略,以及後期用decide_subquery_strategy函式決定子查詢的優化策略等;如果你感興趣,可以參考《資料庫查詢優化器的藝術》第13章的子查詢部分的原始碼分析)和幾個型別(from子句中作為drived,其他子句中作為subquery等)。細化分解,mysql這一點做得很好。

---mysql的子查詢優化,有其侷限之處,如對其他一些子查詢型別不支援(如等值的一些子查詢)

---2.2 效率角度:技術好不等於效率好。這是多種原因共同決定的。比如資料庫整體架構,併發控制的機制,儲存架構等都影響著每一種功能。所以實踐中,我們需要去檢驗測試才行。

---3 「能不用就盡量不用」,客觀地講,這個目前來看不是個好主意。好的做法是:首先,相信優化器能做好; 其次,sql書寫方便理解;再次,觀察找出瓶頸再調優。

---畢竟我們要追求整體效率,而不光是只追求某乙個sql的效率。上線前驗證好,上線後不斷觀測分析就行。

---當然,書寫sql時,能寫出即語義明了,又不用子查詢的sql,那是最好不過了。

---另外,《資料庫查詢優化器的藝術》第四篇,對比了pg和mysql的子查詢優化技術,可供參考,以便進一步認識mysql子查詢技術。

Mysql採用子查詢優化查詢語句,提高查詢效率

摘要 mysql的優化方式有很多,這裡我先介紹一種,就是在使用連線查詢中的優化。案例 比如我要查詢100萬條資料中id小於100的資料,a表和b表有相同的字段id,那麼id就可以成為連線查詢的條件。如下所示 select from a join b on a.id b.id where id 100...

MySql 技術內幕 查詢處理和子查詢

一.查詢流程 1.查詢流程中,每個操作都產生乙個虛擬表,除了最後乙個,其他對使用者都是透明的.2.查詢流程 如果在查詢中指定了distinct子句,則會建立一張記憶體臨時表 記憶體中放不下就放磁碟 表結構和虛表一樣,不同的是distinct列,增加了乙個唯一索引,以此來去重資料 4.物理查詢處理 p...

的查詢優化技術

資料庫的 查詢優化技術 高山鷹 2002 11 2415 31 28 資料庫系統是管理資訊系統的核心,基於資料庫的聯機事務處理 oltp 以及聯機分析處理 olap 是銀行 企業 等部門最為重要的計算機應用之一。從大多數系統的應用例項來看,查詢操作在各種資料庫操作中所佔據的比重最大,而查詢操作所基於...