MySQL查詢優化詳解
阿新 • • 發佈:2019-01-04
客戶端與MySQL伺服器的查詢通訊步驟如下
- 客戶端與伺服器進行通訊
- SQL語句查詢MySQL服務的快取(如果伺服器開啟了快取)
- 解析器將SQL語句解析為解析樹
- 前處理器判斷解析樹是否符合規範
- 查詢優化器對SQl進行優化處理
- 查詢執行引擎查詢資料
- 返回客戶端
MySQL執行路徑如下圖:
MySql服務端和客戶端狀態查詢
對於一個MySQL連線,或者說一個執行緒,時刻都有一個狀態標識它在做什麼
檢視命令:show full processlist / show processlist
- Sleep 執行緒正在等待客戶端傳送資料
- Query 執行緒正在執行查詢
- Locked 執行緒正在等待表鎖的釋放
- Sorting result 執行緒正在對結果進行排序
- 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語句的結果集)
不會被快取的情況
- 查詢語句中有不確定的資料時,則不會被快取,如自定義函式NOW(),儲存變數
- 當查詢的結果大於query_cache_limit設定的值,則不會被快取
- 對於Innodb引擎來說,當一個語句修改了表中的資料,在事務提交之前,所用的查詢操作都無法被快取
- 查詢的是系統表
- 查詢的表不存在
MySQL預設關閉快取
- 在查詢之前必須檢查是否命中快取,浪費計算資源
- 如果查詢可以被快取,那麼執行完查詢,MySQL會發現將這個查詢和結果集寫入快取,消耗系統性能
- 針對表的寫入和更新,表的所有快取都會失效
- 查詢快取很大或者碎片很多時,這個會給系統帶來很大的負擔
快取查詢使用場景
以讀位置的業務,資料生成之後不常改的資料