MySQL知識點

MySQL邏輯架構

輸入圖片說明

MySQL整個邏輯架構總體分爲三層:mysql

  • 客戶端層,最上層,不是MySQL獨有,例如鏈接處理、受權認證、安全等
  • 核心服務層,包括查詢解析、分析、優化、緩存、內置函數等,還有存儲過程、觸發器、視圖等
  • 存儲引擎,最下層,負責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';

查詢過程總結

  • 客戶端向MySQL服務器發送一條查詢請求
  • 服務器首先檢查查詢緩存,若是緩存命中,則馬上返回緩存中的數據。不然進入下一階段
  • 服務器進行SQL解析、預處理,再由優化器生成對應的執行計劃
  • MySQL根據執行計劃,調用存儲引擎的API進行數據查詢
  • 將結果返回給客戶端,同時緩存查詢結果

知識點

  1. 當查詢語句很長時,須要設置max_allowed_packet參數
  2. 服務端響應給客戶端的數據,由多個數據包組成。在實際開發中,儘可能保持查詢簡單且只返回必須的數據,減少通訊間數據包的大小和數量是一個很是好的習慣,這也是查詢中儘可能避免使用SELECT * 以及加上LIMIT限制的緣由之一。
  3. 用多個小表代替一個大表,可是不要過分設計
  4. 批量插入,代替循環單條插入
  5. 能夠經過SQL_CACHE和SQL_NO_CACHE來控制某個查詢語句是否須要進行緩存
相關文章
相關標籤/搜索