MySQL查詢緩存
阿新 • • 發佈:2017-11-26
sele 補充 表示 理想 flush 個數 超出 命中率 color
二.緩存會帶來額外開銷
1>.每個查詢都會先檢查是否命中;
2>.查詢結果要先緩存;
當服務器有多顆CPU時,且並發量的非常大時,這個時候我們就要考慮各個CPU掙奪緩存的內存空間的問題,也就是說當這種情況出現時,我們需要去衡量緩存的效率問題。當然你還要結合以上兩點進行判斷:
三.查詢緩存相關變量
MySQL查詢緩存
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.什麽是MySQL查詢緩存 用於保存MySQL查詢語句返回的完整結果,被命中時,MySQL會立即返回結果,省去解析、優化和執行等操作。把select語句本身做hash計算,計算的結果作為key,查詢結果作為value,如果查詢語句被緩存命中,就直接將value返回。 查詢語句中有一些不確定數據時,不會緩存;例如now(),current_time();一般來說,如果查詢中包含用戶自定義函數、存儲函數、用戶變量、臨時表、mysql庫中系統表、或者任何包含權限的表,一般都不會緩存。
1 mysql> show global variables like ‘query_cache%‘; 2 +------------------------------+---------+ 3 | Variable_name | Value | 4四.如何判斷命中率 MySQL查詢緩存的命中率分為次數和字節命中率。狀態變量是MySQL統計查詢的結果,服務器變量是我們可以提前設定的值,可以提前定義它的工作屬性,mysql狀態變量是在工作時不斷的統計數據的值(比如緩存命中的頻率等等)。我們可以通過以下命令進行查詢:+------------------------------+---------+ 5 | query_cache_limit | 1048576 | 6 | query_cache_min_res_unit | 4096 | 7 | query_cache_size | 0 | 8 | query_cache_type | ON | 9 | query_cache_wlock_invalidate | OFF | 10 +------------------------------+---------+ 115 rows in set (0.00 sec) 12 13 mysql> 14 15 1>.query_cache_type: 16 查詢緩存類型;是否開啟緩存功能,開啟方式有三種{ON|OFF|DEMAND},其中DEMAND意味著select語句明確使用sql_cache選項才會緩存喲。 17 2>.query_cache_size: 18 緩存使用的總空間。單位為字節,大小必須為1024的整數倍。mysql啟動時,會一次分配並立即初始化這裏指定大小的內存空間;這意味著, 19 如果修改此大小,會清空所有緩存並重新初始化的。因此不建議修改此大小,最好是一開始就設計好,此內存不宜過大。 20 3>.query_cache_min_res_unit: 21 存儲緩存的最小內存塊 (query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache能夠獲得一個理想的值 22 4>.query_cache_limit: 23 單個緩存對象的最大值,超出時則不予緩存;手動使用SQL_NO_CACHE可以人為的避免嘗試緩存返回超出此參數限定值得語句 24 5>.query_cache_wlock_invalidate: 25 如果某個表被其他用戶連接鎖住了,是否仍然從緩存中返回結果,OFF表示返回。
1 mysql> show global status like ‘Qcache%‘; 2 +-------------------------+-------+ 3 | Variable_name | Value | 4 +-------------------------+-------+ 5 | Qcache_free_blocks | 0 | 6 | Qcache_free_memory | 0 | 7 | Qcache_hits | 6 | 8 | Qcache_inserts | 0 | 9 | Qcache_lowmem_prunes | 0 | 10 | Qcache_not_cached | 0 | 11 | Qcache_queries_in_cache | 0 | 12 | Qcache_total_blocks | 0 | 13 +-------------------------+-------+ 14 8 rows in set (0.01 sec) 15 16 mysql> 17 1>.Qcache_free_blocks #指的是空閑塊數,指的是系統分配給MySQL進程的緩存總大小空間中還沒有使用的空間。 18 2>.Qcache_hits #指的是命中次數 19 3>.Qcache_inserts #向緩存空間中插入的緩存的次數 20 4>.Qcache_free_memory #空閑空間,指的是還沒有被操作系統分配出去的內存空間。 21 5>.Qcache_lowmem_prunes #內存太小,修剪內存的次數 22 6>.Qcache_not_cached #沒被緩存的個數 23 7>.Qcache_queries_in_cache #緩存中緩存的查詢個數 24 8>.Qcache_total_blocks #總塊數,指的是系統分配給MySQL進程的緩存總大小空間 25 9>.補充知識: 26 a>.flush query_cache #碎片整理 27 b>.reset query_cache #清空緩存六.計算命中率
1 mysql> show global status where Variable_name=‘Qcache_hits‘ OR Variable_name=‘Com_Select‘; 2 +---------------+-------+ 3 | Variable_name | Value | 4 +---------------+-------+ 5 | Com_select | 158 | 6 | Qcache_hits | 4 | 7 +---------------+-------+ 8 2 rows in set (0.00 sec) 9 10 mysql> 11 12 1>.總共查詢了Com_select 次數,我們這裏是158次; 13 2>.緩存命中了Qcache_hits次數,我們這裏是命中了4次; 14 因此我們可以計算次數的命中率: Qcache_hits/(Qcache_hits+Com_Select),當然這只是次數的命中率,我們想要查詢字節的命中率的方法就很困難了。因此,也可以參考另外一個指標,命中和寫入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大於3:1.則表明緩存也是有效的,能達到10:1,為比較理想的情況。如果不能達到這個參數,建議是關閉緩存。
七.緩存優化思路 1>.批量寫入,而非多次單個寫入 2>.緩存空間不宜過大,因為大量緩存同事失效時會導致服務器假死 3>.必要時,使用sql_CACHE和sql_no_cache手動控制緩存。 4>.對寫密集型的應用場景來說,禁用緩存反而提高性能。
MySQL查詢緩存