程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 淺談 MySQL Query Cache

淺談 MySQL Query Cache

編輯:關於MYSQL數據庫

Query Cache

就是把 “查詢返回的結果” 緩存起來。
但“查詢返回的結果” 其實不准確,MySQL 還會緩存查詢語句。並在內存中把“查詢語句”及“返回的結果集” 映射起來。

Query Cache 默認為打開。

主要參數有:
query_cache_limit:允許 Cache 的單條 Query 結果集的最大容量,默認是1MB,超過此參數設置的 Query 結果集將不會被 Cache
query_cache_min_res_unit:設置 Query Cache 中每次分配內存的最小空間大小,也就是每個 Query 的 Cache 最小占用的內存空間大小
query_cache_size:設置 Query Cache 所使用的內存大小,默認值為0,大小必須是1024的整數倍,如果不是整數倍,MySQL 會自動調整降低最小量以達到1024的倍數
query_cache_type:控制 Query Cache 功能的開關,可以設置為0(OFF),1(ON)和2(DEMAND)三種:
   0(OFF):關閉 Query Cache 功能,任何情況下都不會使用 Query Cache
   1(ON):開啟 Query Cache 功能,但是當 SELECT 語句中使用的 SQL_NO_CACHE 提示後,將不使用Query Cache
   2(DEMAND):開啟 Query Cache 功能,但是只有當 SELECT 語句中使用了 SQL_CACHE 提示後,才使用 Query Cache
query_cache_wlock_invalidate:控制當有寫鎖加在表上的時候,是否先讓該表相關的 Query Cache失效,
   1(TRUE),在寫鎖定的同時將使該表相關的所有 Query Cache 失效
   0(FALSE),在鎖定時刻仍然允許讀取該表相關的 Query Cache

1. Query Cache 與 查詢
無論 MySQL收到的 Query 是單表還是多表或是包含子查詢的 SQL,都被作為一個 Query,不會被分拆成多個 Query 來進行 Cache。
包括Union 語句。

2. Query Cache 是以 block 的方式存儲的數據塊嗎?
不是,Query Cache 中緩存的內容只與結果集相關。(還cache了結果相關的其他信息)

3. Query Cache 為什麼效率會非常高,即使所有數據都可以 Cache 進內存的情況下,有些時候也不如使用 Query Cache 的效率高?
Query Cache 的查找,是在 MySQL 接受到客戶端請求後在對 Query 進行權限驗證之後,SQL 解析之前。
也就是說,當 MySQL 接收到客戶端的SQL後,僅僅只需要對其進行相應的權限驗證後就會通過 Query Cache 來查找結果,甚至都不需要經過 Optimizer 模塊進行執行計劃的分析優化,更不許要發生任何存儲引擎的交互,減少了大量的磁盤 IO 和 CPU 運算,所以效率非常高。

4. 客戶端提交的 SQL 語句大小寫對 Query Cache 有影響嗎?
有,由於 Query Cache 在內存中是以 HASH 結構來進行映射,HASH 算法基礎就是組成 SQL 語句的字符,所以必須要整個 SQL 語句在字符級別完全一致,才能在 Query Cache 中命中。

5. 一個 SQL 語句在 Query Cache 中的內容,在什麼情況下會失效?
為了保證 Query Cache 中的內容與是實際數據絕對一致,當表中的數據有任何變化,包括新增,修改,刪除等,都會使所有引用到該表的 SQL 的 Query Cache 失效。

6. 為什麼我的系統在開啟了 Query Cache 之後整體性能反而下降了?
當開啟了 Query Cache 之後,尤其是當我們的 query_cache_type 參數設置為 1 以後,MySQL 會對每個 SELECT 語句都進行 Query Cache 查找,查找操作雖然比較簡單,但仍然也是要消耗一些 CPU 運算資源的。而由於 Query Cache 的失效機制的特性,可能由於表上的數據變化比較頻繁,大量的 Query Cache 頻繁的被失效,所以 Query Cache 的命中率就可能比較低下。所以有些場景下,Query Cache 不僅不能提高效率,反而可能造成負面影響。

7. 如何確認一個系統的 Query Cache 的運行是否健康,命中率如何,設置量是否足夠?
MySQL 提供了一系列的 Global Status 來記錄 Query Cache 的當前狀態,具體如下:
  Qcache_free_blocks:目前還處於空閒狀態的 Query Cache 中內存 Block 數目
  Qcache_free_memory:目前還處於空閒狀態的 Query Cache 內存總量
  Qcache_hits:Query Cache 命中次數
  Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數,也就是沒有命中的次數
  Qcache_lowmem_prunes:當 Query Cache 內存容量不夠,需要從中刪除老的 Query Cache 以給新的 Cache 對象使用的次數
  Qcache_not_cached:沒有被 Cache 的 SQL 數,包括無法被 Cache 的 SQL 以及由於 query_cache_type 設置的不會被 Cache 的 SQL
  Qcache_querIEs_in_cache:目前在 Query Cache 中的 SQL 數量
  Qcache_total_blocks:Query Cache 中總的 Block 數量
可以根據這幾個狀態計算出 Cache 命中率,計算出 Query Cache 大小設置是否足夠,一般來說,不建議將 Query Cache 的大小設置超過256MB,這也是業界比較常用的做法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved