MySQL 查詢緩存

MySQL查詢執行流程mysql

wKioL1NWdF-g-z3mAATdFkLRKYs670.jpg

查詢流程sql

  1. 客戶端發送一條查詢給服務器;緩存

  2. 服務器先檢查查詢緩存,若是命中了緩存,則當即返回存儲在緩存中的結果;不然,進入下一階段;服務器

  3. 服務器進行SQL解析、預處理,再由優化器生成對應的執行計劃;函數

  4. MySQL根據優化器生成的執行計劃,調用存儲引擎的API來執行查詢;性能

  5. 將結果返回給客戶端;優化

 

 

查詢緩存spa

  • 用於保存MySQL查詢語句返回的完整結果,被命中時,MySQL會當即返回結果,省去解析、優化和執行等階段;blog

  • MySQL保存結果於緩存中,把select語句自己作hash計算,計算的結果做爲key,查詢結果做爲value;內存

  • 查詢語句的大小寫會影響緩存的存儲和命中,故需保持查詢語句的大小寫一致性;

 

何種語句不會被緩存

  • 查詢語句中有一些不肯定數據時,不會緩存,如now(),current_time()等

  • 若查詢中包含用戶自定義函數,存儲函數,用戶變量,臨時表,mysql庫中系統表,或者任何包含權限的表,通常都不會緩存

 

緩存會帶來額外開銷,由於:

  • 讀查詢在開始以前必須先檢查是否命中緩存;

  • 若某個讀查詢能夠被緩存且未被緩存,那麼當完成執行後,MySQL會將其結果存入查詢緩存;

  • 對寫操做也有影響,由於當寫入數據時,MySQL必須將對應表的全部緩存都設置失效,這在緩存內存較大時將致使很大的系統消耗;

  • 故查詢緩存並不是必需,其效率取決於所有查詢中開銷較大的查詢是否能被緩存命中;

 

緩存相關變量查詢

wKioL1NWdJHxnapRAAhZy1ojoo0875.jpg

 

如何判斷緩存命中率

緩存命中率相關的變量

wKiom1NWdOSDdJESAASKt6x2euE164.jpg

計算緩存命中率

wKiom1NWdQCRW5roAANvlDJ4hnM274.jpg

 

緩存優化的思路

  • 批量寫入而非屢次單個寫入;

  • 緩存空間不宜過大,由於大量緩存同時失效會致使服務器假死;

  • 必要時,使用sql_cache和sql_no_cache手動控制緩存;

  • 對寫密集型的應用場景來講,禁用緩存反而能提升性能

相關文章
相關標籤/搜索