1、邏輯架構圖mysql
MySQL邏輯架構總體分爲四層:sql
第一層是連接線程處理,這一層並不是MySQL獨有,在這一層中,主要功能有連接處理,受權驗證,安全等操做。緩存
第二層是MySQL主要層,全部的語句解析、分析、優化和緩存都在這一層進行,同時內建函數,如日期、時間等函數也在這一層進行。安全
第三層中全部的跨存儲引擎的功能都在該層完成,例如視圖、存儲過程等。服務器
第四層爲存儲引擎,負責數據的獲取和存儲。在該層提供了許多API供上層服務層調用,完成數據操做。架構
工做過程:ide
每個客戶端發起一個新的請求都會由服務器端的鏈接線程處理層接收客戶端的請求並開闢一個新的內存空間,在該空間內生成一個新的線程,當,當每個用戶鏈接到服務器端的時候就會在進程地址空間內生成一個新的線程用於響應客戶端請求,用戶發起的查詢請求都在線程空間內運行,結果也在這裏面緩存並返回給服務器端。最後線程的銷燬和重用都是由鏈接線程處理管理器完成的。函數
2、MySQL查詢過程優化
以下圖所示:
線程
一、客戶端/服務器通訊協議
該部分爲半雙工狀態,要麼是客戶端向服務器發送數據,要麼是服務器向半雙工發送數據,兩者不能同時進行。
當客戶端向服務器發送數據時以單獨一個數據包的形式發送,若查詢太大,服務器會拒絕接收更多的數據,並拋出異常;
當服務器端向客戶端發送數據包時,通常包括多個數據包。客戶端必須完整的接收全部的數據,不能拒絕接收部分數據只獲取前幾條。在開發過程當中應該儘可能保持簡單和必要的查詢,這也是減小select *和加上limit限制的緣由。
二、查詢緩存
在解析查詢語句以前,若是開啓了查詢緩存,MySQL會檢查當前查詢是否命中緩存中的數據,若是命中會直接將緩存中的數據響應給客戶端,不然會執行後面的解析等操做。
MySQL的緩存存放在一個引用表中,以一個哈希值做爲索引。該索引包含了一系列與查詢有關的信息,例如查詢自己、要查詢的表等。若是兩個查詢在任何一個字符上有所不一樣就不會命中緩存。固然,不是全部的查詢都會存在緩存中,當查詢語句中包含函數、用戶變量、臨時表時就不會存入緩存。例如,一個查詢語句中包含NOW()函數,不一樣的時間查詢會有不一樣的查詢結果,存入緩存毫無心義,因此該查詢就不會被存入緩存。
MySQL的緩存也存在失效的狀態,全部會影響查詢結果的信息都會糅合進一個哈希值做爲索引,因此當某一個表的數據或者結構發生變化時,該表所涉及到的全部緩存都會失效。即對某表執行寫操做時,該表所涉及到的緩存就會被設置爲失效。當查詢緩存很是大時,這個操做會形成較大的系統消耗。在讀操做時,每個查詢語句執行前都會檢查是否命中緩存,執行後都會存入緩存。是否打開緩存應慎之又慎。
三、語法解析及預處理
語法解析會將查詢語句進行解析生成一顆解析樹,這個過程主要是經過語法進行檢查。預處理會將解析樹再次進行解析,會檢查查詢所包含的表、列等是否存在。
四、查詢優化
一條語句有多中實現方式,優化器的做用就是評估某種執行成本而且選擇成本最小的那一個。固然,咱們所預想的執行方式,不必定就是MySQL真正的執行方式。優化器會對執行順序進行從新排序並執行,選出MySQL認爲的最優解。
MySQL的查詢優化器是一個很是複雜的部件,它使用了很是多的優化策略來生成一個最優的執行計劃: 1. 從新定義表的關聯順序(多張表關聯查詢時,並不必定按照SQL中指定的順序進行,但有一些技巧能夠指定關聯順序)
2. 優化MIN()和MAX()函數(找某列的最小值,若是該列有索引,只須要查找B+Tree索引最左端,反之則能夠找到最大值,具體原理見下文)
3. 提早終止查詢(好比:使用Limit時,查找到知足數量的結果集後會當即終止查詢)
4. 優化排序(在老版本MySQL會使用兩次傳輸排序,即先讀取行指針和須要排序的字段在內存中對其排序,而後再根據排序結果去讀取數據行,而新版本採用的是單次傳輸排序,也就是一次讀取全部的數據行,而後根據給定的列排序。對於I/O密集型應用,效率會高不少)
五、查詢執行引擎
查詢執行引擎會根據優化階段生成的執行計劃,依次執行並給出結果。這些主要實現方式是經過調用存儲引擎的API實現,這些API提供了強大的功能,經過疊加等操做實現查詢。
六、響應給客戶端
不管是否有查詢結果,都會返回給客戶端,包括影響到行數、執行時長等等。
此時若查詢緩存打開,會將查詢結果存入緩存。
當有查詢結果時,返回的結果集是一個增量過程。mysql可能在生成的第一條結果時就會將結果返回給客戶端,客戶端不斷接收直至完畢。服務端無需存儲結果集佔用內存客戶端也能夠第一時間接收到結果。