1. 程式人生 > >MySQL查詢緩存

MySQL查詢緩存

sele 補充 表示 理想 flush 個數 超出 命中率 color

                        MySQL查詢緩存

                                        作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

一.什麽是MySQL查詢緩存   用於保存MySQL查詢語句返回的完整結果,被命中時,MySQL會立即返回結果,省去解析、優化和執行等操作。把select語句本身做hash計算,計算的結果作為key,查詢結果作為value,如果查詢語句被緩存命中,就直接將value返回。   查詢語句中有一些不確定數據時,不會緩存;例如now(),current_time();一般來說,如果查詢中包含用戶自定義函數、存儲函數、用戶變量、臨時表、mysql庫中系統表、或者任何包含權限的表,一般都不會緩存。
二.緩存會帶來額外開銷   1>.每個查詢都會先檢查是否命中;   2>.查詢結果要先緩存;   當服務器有多顆CPU時,且並發量的非常大時,這個時候我們就要考慮各個CPU掙奪緩存的內存空間的問題,也就是說當這種情況出現時,我們需要去衡量緩存的效率問題。當然你還要結合以上兩點進行判斷: 三.查詢緩存相關變量
 1 mysql> show global variables like query_cache%;
 2 +------------------------------+---------+
 3 | Variable_name                | Value   |
 4
+------------------------------+---------+ 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 +------------------------------+---------+ 11
5 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表示返回。
四.如何判斷命中率   MySQL查詢緩存的命中率分為次數和字節命中率。狀態變量是MySQL統計查詢的結果,服務器變量是我們可以提前設定的值,可以提前定義它的工作屬性,mysql狀態變量是在工作時不斷的統計數據的值(比如緩存命中的頻率等等)。我們可以通過以下命令進行查詢:
 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查詢緩存