MySQL 查詢緩存 QUERY_CACHE


查詢緩存(QueryCache)保存查詢返回的完整結果。當查詢命中該緩存,MySQL會立即返回結果,跳過解析、優化和執行階段。

官方在特定環境測試結果(官方文檔中有詳細說明):

1.如果對某表進行簡單查詢,但每次查詢條件都不一樣時,打開查詢緩存會導致性能下降13%

2.如對一個只有一行數據的表進行查詢,則可以提升238%

所以查詢緩存特別適用於更新頻率非常低、查詢頻率非常高的場景。

 

緩存命中規則

緩存存放在一個引用表中,通過一個哈希值引用,哈希值包含了(查詢本身、當前查詢的數據庫、客戶端協議的版本等)。

判斷是否命中時,MySQL不會解析語句,而是直接使用SQL語句和客戶端發送來的其他原始信息。任何字符上的不同都會導致緩存不命中。

如果查詢語句中包含任何的不確定函數則不會緩存(如NOW()),因為在執行這個查詢之后,MySQL會禁止緩存該查詢,所以在查詢緩存中是不可能找到緩存結果的。

 

什么情況下查詢緩存能發揮作用

並不是所有情況下查詢緩存都能提高系統性能。打開查詢緩存對讀和寫操作都會帶來額外消耗:

  • 讀查詢在開始之前必須先檢查是否命中緩存。
  • 如果這個讀查詢可以被緩存,那么當完成執行后,需要將結果存入緩存。
  • 每次寫入操作時,需要將對應表的所有緩存都設置失效。如果緩存較大或碎片很多,則會帶來很大消耗。

 

緩存命中率:

SHOW STATUS中能提供一個全局的性能指標用以計算緩存命中率:

每次SELECT查詢,要么增加Qcache_hits(查詢緩存命中次數),要么增加Com_select(無緩存的查詢次數+錯誤查詢+權限檢查查詢),所以命中率計算公式:Qcache_hits / (Qcache_hits + Com_select)。

 

 

緩存配置和維護

query_cache_type:是否打開查詢緩存。可以設置為(OFF、ON、DEMAND)。DEMAND表示只有在查詢語句中明確標記SQL_CACHE的語句才放入查詢緩存。

query_cache_size:查詢緩存使用總空間。

query_cache_min_res_unit:在查詢緩存中分配內存塊的最小單位。

query_cache_limit:MySQL能緩存的最大查詢結果。

query_cache_wlock_invalidate:如果某個數據表被其他的連接鎖住,是否仍然從查詢緩存中返回結果。

 

 

指定MySQL查詢緩沖區的大小。可以通過在MySQL控制台執行以下命令觀察:

SHOW VARIABLES LIKE '%query_cache%';
SHOW STATUS LIKE 'Qcache%';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM