MySQL查詢緩存詳解


MySQL查詢緩存    

     用於保存MySQL查詢語句返回的完整結果,被命中時,

     MySQL會立即返回結果,省去解析、優化和執行等階段


併發查詢量非常大、cup核心數非常多時緩存並不一定有效

(多個線程會爭用存儲緩存的這段內存空間)



如何檢查緩存???

    MySQL保存結果與緩存中:

       把select語句本身做hash計算,計算的結果作爲key,查詢結果作爲value


什麼樣的語句不會被緩存?

    查詢語句中有一些不確定數據時,不會緩存;例如now(),current_time();

    一般來說,如果查詢中包含用戶自定義函數、存儲函數、用戶變量、臨時表、mysql庫中系統表、或者任何包含權限的表,一般都不會緩存


緩存會帶來額外開銷

    1、每個查詢都會先檢查是否命中

    2、查詢結果要先緩存(寫緩存)


查看跟緩存相關的變量

mysql> show global variables like 'query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+


query_cache_type:查詢緩存類型:是否開啓緩存功能,開啓方式有三種{ON|OFF|DEMAND}
   DEMAND:意味着select語句明確使用sql_cache選項纔會緩存 (SQL_NO_CACHE則不會緩存)

query_cache_size:總空間;單位爲字節,大小必須爲1024的整數倍.mysql啓動時,會一次分配並立即初始化這裏指定大小的內存空間;
   這意味着,如果修改此大小,會清空緩存並重新初始化的.

query_cache_min_res_unit:存儲緩存的最小內存塊;(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache 能夠獲得一個理想的值
   設置過大,容易浪費;設置過小,容易產生大量碎片

query_cache_limit:單個緩存對象的最大值,超出時則不予緩存;手動使用SQL_NO_CACHE可以人爲的避免嘗試緩存返回超出此參數限定值得語句

query_cache_wlock_invalidate:如果某個表被其他用戶連接鎖住了,是否仍然從緩存中返回結果,OFF表示返回



如何判斷命中率:

    分爲次數和字節命中率(命中以後,所省去的數據傳輸量或解析本身所開銷的大小)


mysql> show global status like 'Qcache%';
+-------------------------------------------------+----------+
| Variable_name                                   | Value    |
+-------------------------------------------------+----------+
| Qcache_free_blocks(空閒塊數)                  | 1        |
| Qcache_free_memory(空閒空間)                  | 16759688 |
| Qcache_hits(命中次數)                         | 0        |
| Qcache_inserts (插入次數)                       | 2        |
| Qcache_lowmem_prunes(內存太小,修剪內存的次數) | 0        |
| Qcache_not_cached(沒被緩存的個數)             | 8        |
| Qcache_queries_in_cache(緩存中緩存的查詢個數) | 0        |
| Qcache_total_blocks(總塊數)                   | 1        |
+-------------------------+----------------------------------+


碎片整理 mysql > flush query_cache

清空緩存 mysql > reset query_cache


計算命中率:

mysql > show global status where Vaiable_name='Qcache_hits' OR Variable_name='Com_Select';

Qcache_hits/(Qcache_hits + Com_Select)


mysql> show global status where Variable_name='Qcache_hits' OR Variable_name='Com_Select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 25    | // 總查詢此時,命中則不會累計
| Qcache_hits   | 3     |
+---------------+-------+

命中率=3/(3+25)




緩存優化思路

    1.批量寫入,而非多次單個寫入

    2.緩存空間不宜過大,因爲大量緩存同事失效時會導致服務器假死

    3.必要時,使用sql_CACHE和sql_no_cache手動控制緩存。

    4.對寫密集型的應用場景來說,禁用緩存反而提高性能。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章