MySQL查詢執行流程mysql
查詢流程:sql
客戶端發送一條查詢給服務器;緩存
服務器先檢查查詢緩存,若是命中了緩存,則當即返回存儲在緩存中的結果;不然,進入下一階段;服務器
服務器進行SQL解析、預處理,再由優化器生成對應的執行計劃;函數
MySQL根據優化器生成的執行計劃,調用存儲引擎的API來執行查詢;性能
將結果返回給客戶端;優化
查詢緩存spa
用於保存MySQL查詢語句返回的完整結果,被命中時,MySQL會當即返回結果,省去解析、優化和執行等階段;blog
MySQL保存結果於緩存中,把select語句自己作hash計算,計算的結果做爲key,查詢結果做爲value;內存
查詢語句的大小寫會影響緩存的存儲和命中,故需保持查詢語句的大小寫一致性;
何種語句不會被緩存
查詢語句中有一些不肯定數據時,不會緩存,如now(),current_time()等
若查詢中包含用戶自定義函數,存儲函數,用戶變量,臨時表,mysql庫中系統表,或者任何包含權限的表,通常都不會緩存
緩存會帶來額外開銷,由於:
讀查詢在開始以前必須先檢查是否命中緩存;
若某個讀查詢能夠被緩存且未被緩存,那麼當完成執行後,MySQL會將其結果存入查詢緩存;
對寫操做也有影響,由於當寫入數據時,MySQL必須將對應表的全部緩存都設置失效,這在緩存內存較大時將致使很大的系統消耗;
故查詢緩存並不是必需,其效率取決於所有查詢中開銷較大的查詢是否能被緩存命中;
緩存相關變量查詢
如何判斷緩存命中率
緩存命中率相關的變量
計算緩存命中率
緩存優化的思路
批量寫入而非屢次單個寫入;
緩存空間不宜過大,由於大量緩存同時失效會致使服務器假死;
必要時,使用sql_cache和sql_no_cache手動控制緩存;
對寫密集型的應用場景來講,禁用緩存反而能提升性能