mysql是最普遍使用的開源數據庫之一,做爲後端開發人員,或多或少都會和mysql打交道,本篇文章會從sql查詢語句的執行過程,來介紹mysql的服務器架構,mysql
查詢的過程大體分爲從客戶端到服務器,在服務器上解析,生成執行計劃,執行,並返回結果給客戶端。以下圖1.1所示。sql
圖1.1 sql查詢執行路徑數據庫
鏈接器對客戶端的鏈接請求進行用戶名和密碼的驗證,並會管理鏈接池。客戶端和服務器爲「半雙工」通訊協議,客戶端和服務器沒法同時發送消息,當服務器向客戶端發送查詢結果時,必須所有返回,客戶端不能主動中止,mysql須要等全部的數據都發送給了客戶端纔會釋放本次查詢所佔用的資源,所以大多數庫函數都會接收結果並緩存在客戶端,以使查詢早點結束,減輕服務端壓力。後端
對於鏈接到mysql的客戶端,能夠用show full processlist查看鏈接狀態,該狀態表示了mysql當前在作什麼,一個查詢完整的生命週期,狀態會變不少次。緩存
在show full processlist中,字段command表示線程正在執行的命令類型,The type of command the thread is executing,通常就是休眠(sleep),查詢(query),鏈接 (connect),含義以下:服務器
show full processlist最重要的字段是state,Most states correspond to very quick operations. If a thread stays in a given state for many seconds,there might be a problem that needs to be investigated.An action, event, or state that indicates what the thread is doing,表示線程處於某一狀態下具體正在作什麼,值的含義以下:mysql優化
在解析sql語句以前,mysql會從查詢緩存中獲取數據,具體是一個大小寫敏感的哈希查找,sql語句必須和緩存中的sql語句徹底匹配,不然不會命中,對於更新比較頻繁的數據庫,常常會致使緩存失效,建議將查詢緩存關閉。數據結構
假如查詢緩存沒有命中,則會進入分析器,對sql語句進行詞法和語法分析,並會進行預處理,以便知道此sql語句是要作什麼。它會驗證是否使用錯誤的關鍵字,關鍵字順序是否正確等。而且,預處理會根據一些規則對解析樹的合法性進行進一步校驗,好比檢查數據表和列是否存在,解析名字和別名,看看是否有歧義等,以下圖1.2常常遇到的語法錯誤就在這一階段架構
圖1.2 sql語法錯誤提示併發
sql語句通過分析器分析合法,須要通過查詢優化器轉化成執行計劃,查詢優化器解決的是怎麼作的問題,相同的sql語句,返回相同的結果集,有不少種執行方式,查詢優化器就是要選擇性能較好的一種。
mysql是基於成本的優化器,會預測一個查詢使用某種計劃時的成本,並選擇其中成本最小的一種,能夠經過Last_query_cost值查詢到當前會話查詢的成本。不少緣由會致使mysql優化器選擇錯誤的執行計劃,好比:統計信息不許、不考慮其餘併發執行的查詢,執行計劃太多,沒法估算全部的計劃等。
查詢執行引擎根據優化器生成的執行計劃(執行計劃是一種數據結構,而不是字節碼),調用存儲引擎接口,完成執行計劃中的全部操做。mysql將查詢結果返回客戶端是一個增量、逐步返回的過程。開始生成第一條結果,mysql就能夠開始向客戶端返回數據。這樣作服務端無需存儲太多結果,減少了服務端內存的消耗壓力,另外,客戶端也能夠第一時間得到返回的結果。