- 建立連接(Connector & Connection Pool)
- 通過客戶端/服務器通信協議與MySQL建立連接,MySQL客戶端與服務端的通信方式是”半雙工“。
- "單工"(simplex):單工通信只支持信號在一個方向上傳輸(正向或反向),任何時候不能改變信號的傳輸方向。為保證正確傳送數據信號,接收端要對接收的數據進行校驗,若校驗出錯,則通過監控信道發送請求重發的信號。
- "半雙工"(half-duplex):半雙工通信允許信號在兩個方向上傳輸,但某一時刻只允許信號在一個信道上單向傳輸。 因此,半雙工通信實際上是一種可切換方向的單工通信。
- "全雙工"(full-duplex):全雙工通信允許數據同時在兩個方向上傳輸,即有兩個信道,因此允許同時進行雙向傳輸。 全雙工通信是兩個單工通信方式的結合,要求收發雙方都有獨立的接收和發送能力。
- 通過客戶端/服務器通信協議與MySQL建立連接,MySQL客戶端與服務端的通信方式是”半雙工“。
-
-
- Id:線程ID
- User:執行當前線程的用戶
- Host:發送請求的客戶端IP和端口號
- db:執行當前線程的數據庫
- Command:該線程正在執行的操作命令
- Create DB:正在創建庫操作
- Drop DB:正在刪除庫操作
- Execute:正在執行一個PreparedSTatement
- Close Stmt:正在關閉一個PreparedStatement
- Query:正在執行一個語句
- Daemon:置后臺
- Time:該線程處于當前狀態的時間,單位s
- State:線程狀態
- Updating:正在搜索匹配結果,進行修改
- Sleeping:正在等待客戶端發送新請求
- Starting:正在執行請求處理
- Checking table:正在檢查數據表
- Closing table:正在將表中數據刷新到磁盤中
- Locked:被其他查詢lock
- Sending Data:正在處理select查詢,同時將結果發送給客戶端
- Info:記錄線程執行的語句,默認顯示前100個字符。show full processlist,查看完成的Info信息
-
- 查詢緩存(Cache & Buffer)
- 查看查詢緩存是否啟動、空間大小、限制等
-
- 查看更詳細的緩存參數,可用緩存空間、緩存塊、緩存占用大小等
-
- 開啟緩存緩存也不會生效的相關命令
- 查詢語句使用SQL_NO_CACHE
- 查詢結果大于query_cache_limit設置
- 查詢中有不確定的參數,比如now()
- 開啟緩存緩存也不會生效的相關命令
- 解析器(Parser)
- 將客戶端發送的SQL進行語句解析,生成"解析數"。預處理器根據MySQL規則檢查"解析數"是否合法,最后生成新的"解析數"
- 查詢優化器(Optimizer)
- 根據"解析數"生成最優的執行計劃。優化策略:靜態優化(編譯時優化)、動態優化(運行時優化)。
- 等價變換策略:基于無效查詢(1=1)、變量查詢(a < b and a = 5)、聯合索引等的優化
- 優化count、min、max等函數
- InnoDB引擎min函數只需要找索引最左邊的數據
- InnoDB引擎man函數只需要找索引最右邊的數據
- MyISAM引擎count(*)直接返回
- 提前終止查詢:使用limit查詢,獲取limit所需的數據之后,停止遍歷后面的數據
- in的優化:對in查詢,會先對in中的數據進行排序,然后再采用二分法查詢數據。
- 根據"解析數"生成最優的執行計劃。優化策略:靜態優化(編譯時優化)、動態優化(運行時優化)。
- 查詢執行引擎
- 負責執行SQL語句,會根據表中的存儲引擎類型,以及對應的API接口與底層存儲引擎緩存/物理文件交互,得到結果并返回客戶端。
- 若開啟查詢緩存,會將SQL語句和結果完整的保存在查詢緩存(Cache & Buffer)中,若再次查詢則直接返回結果。
- 如果需要返回的結果過多,則采用增量模式返回。