1. 程式人生 > >MySQL查詢優化詳解

MySQL查詢優化詳解

客戶端與MySQL伺服器的查詢通訊步驟如下

  1. 客戶端與伺服器進行通訊
  2. SQL語句查詢MySQL服務的快取(如果伺服器開啟了快取)
  3. 解析器將SQL語句解析為解析樹
  4. 前處理器判斷解析樹是否符合規範
  5. 查詢優化器對SQl進行優化處理
  6. 查詢執行引擎查詢資料
  7. 返回客戶端

MySQL執行路徑如下圖:

MySql服務端和客戶端狀態查詢

 對於一個MySQL連線,或者說一個執行緒,時刻都有一個狀態標識它在做什麼

  檢視命令:show full processlist / show processlist

  1. Sleep 執行緒正在等待客戶端傳送資料
  2. Query 執行緒正在執行查詢
  3. Locked 執行緒正在等待表鎖的釋放
  4. Sorting result 執行緒正在對結果進行排序
  5. Seedding Data 向請求端返回資料

      可以通過kill {id }的方式殺掉連線

MySQL查詢快取

query_cache_type

值:0    --不啟用查詢快取,預設值

值:1    --啟動查詢快取,只要符合快取規範的,查詢的SQL語句和結果集都會快取起來

供給其他客戶端使用

值:2    --啟用查詢快取,只要查詢語句中添加了引數SQL_CACHE,且符合快取查詢要求,

客戶端的查詢語句和結果集就會快取起來

   query_cache_size

允許設定query_cache_size的值設定為40k,預設1M,推薦使用64M/128M

    query_cache_limit

限制查詢快取區最大的查詢記錄,預設為1M

     show status like 'Qcache%'

該命令可以檢視快取情況

   工作原理:

             快取Select操作的集和SQL語句

             新的SELECT語句,先去查詢快取,判斷是否有可用的結果集

       判斷標準:

              與快取的SQL語句,是否完全一致,區分大小寫

       (簡單認為儲存了一個key-value結構,key為SQL,value為SQL語句的結果集)

  不會被快取的情況

  1. 查詢語句中有不確定的資料時,則不會被快取,如自定義函式NOW(),儲存變數
  2. 當查詢的結果大於query_cache_limit設定的值,則不會被快取
  3. 對於Innodb引擎來說,當一個語句修改了表中的資料,在事務提交之前,所用的查詢操作都無法被快取
  4. 查詢的是系統表
  5. 查詢的表不存在

MySQL預設關閉快取

  1. 在查詢之前必須檢查是否命中快取,浪費計算資源
  2. 如果查詢可以被快取,那麼執行完查詢,MySQL會發現將這個查詢和結果集寫入快取,消耗系統性能
  3. 針對表的寫入和更新,表的所有快取都會失效
  4. 查詢快取很大或者碎片很多時,這個會給系統帶來很大的負擔

快取查詢使用場景

       以讀位置的業務,資料生成之後不常改的資料