MySQL整個邏輯架構總體分爲三層:mysql
若是但願MySQL提升查詢性能,最好的辦法是弄清楚MySQL是如何優化和執行查詢的,就會發現:不少的查詢優化工做,實際上就是遵循一些原則,讓MySQL的優化器可以按照預想的合理方式運行而已sql
MySQL客戶端與服務端的通訊協議是「半雙工」的:任意時刻,要麼是服務端向客戶端發送數據,要麼是客戶端向服務器發送數據,這兩個動做不能同時發生,因此咱們沒法也無須將一個消息切成小塊獨立發送,也沒有辦法進行流量控制。緩存
在解析一個查詢語句前,若是查詢緩存是打開的,那麼MySQL會檢查這個查詢語句是否命中緩存中的數據。若是當前查詢剛好命中查詢緩存,這種狀況下,查詢不會被解析,也不會生成執行計劃,更不會執行。安全
若是查詢語句中包含任何用戶自定義函數、存儲函數、用戶變量、臨時表或者MySQL庫中的系統表,其查詢結果不會被緩存。服務器
在任何的寫操做時,MySQL必須將對應表的全部** **。若是查詢緩存不少或者碎片不少時,這個操做可能帶來很大的系統消耗,甚至致使系統僵死一會。並且查詢緩存對系統的額外消耗也體如今讀操做。架構
MySQL經過關鍵字將SQL語句進行解析,並生成一顆對應的解析樹,該過程,解析器主要經過語法規則來驗證和解析,好比SQL中是否使用了錯誤的關鍵字或者關鍵字的順序是否正確等。函數
預處理,根據MySQL規則進一步檢查解析樹是否合法,好比檢查要查詢的數據表或列是否存在等。性能
多數狀況下,一條查詢能夠有多種執行方式,都返回相應的結果。優化器的做用,是找到其中最好的執行計劃。優化
MySQL使用基於成本的優化器,它嘗試預測一個查詢使用某種執行計劃時的成本,並選擇其中成本最小的一個。能夠經過查詢當前會話的last_query_cost的值來獲得其計算當前查詢的成本。如:設計
mysql>select * from t_msg limit 10; mysql>show status like 'last_query_cost';