MySQL查詢緩存mysql
用於保存MySQL查詢語句返回的完整結果,被命中時,MySQL會當即返回結果,省去解析、優化和執行等階段。sql
如何檢查緩存?緩存
MySQL保存結果於緩存中:服務器
把SELECT語句自己作hash計算,計算結果爲key,查詢結果做爲value。函數
不會被緩存的數據:性能
查詢語句中有一些不肯定數據時,不會緩存,例如NOW(),CURRENT_TIME(),通常來講,若是查詢中包含自定義函數、存儲函數、用戶變量、臨時表、mysql庫中系統表、或者任何包含權限的表,通常都不會被緩存。優化
緩存會帶來額外開銷:spa
一、每一個查詢都得先檢查是否命中;對象
二、檢查結果要先緩存;內存
與緩存相關的變量:
查看緩存變量SHOW GLOBAL VARIABLES LIKE 'query_cache%';
query_cache_limit:單個緩存對象的最大值,超出的不緩存,手動使用SQL_NO_CACHE能夠人爲避免嘗試緩存返回結果超出此參數限定值的語句。
query_cache_min_res_unit:存儲緩存的最小內存塊;計算方法:(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache
query_cache_size:總空間,單位爲字節,大小必須是1024倍數。MySQL啓動時,會一次分配並當即初始化這裏指定大小的內存空間,這意味着,若是修改此大小,會清空緩存,並從新初始化;
query_cache_type:查詢緩存類型;是否開啓緩存功能,開啓方式有三種{ON|OFF|DEMAND};
DEMAND:意味着SELECT語句明確使用SQL_CACHE選項是纔會緩存;query_cache_wlock_invalidate:若是某個數據表被其餘用戶鏈接鎖住了,是否仍然從緩存中返回結果,OFF表示返回。
如何判斷命中率:
SHOW GLOBAL STATUS LIKE 'Qcache%';
Qcache_free_blocks:空閒塊數
Qcache_free_memory:空閒空間
Qcache_hits:命中次數
Qcache_inserts:向緩存空間中寫入緩存的次數
Qcache_lowmem_prunes:由於內存小,騰出內存的次數
Qcache_not_cached:沒被緩存的個數
Qcache_queries_in_cache:在緩存中緩存的插入的查詢的個數
Qcache_total_blocks:總塊數
碎片整理:FLUSH QUERY_CACHE
清除緩存:RESET QUERY_CACHE
計算命中率:
SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits' OR Variable_name='Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 10 |
| Qcache_hits | 0 |
+---------------+-------+
Qcache_hits/( Com_select+ Qcache_hits)
還須要參考命中和寫入的比率,即Qcache_hits/ Qcache_inserts的值,此值若是能大於3:1,則代表緩存也是有效的,能達到10:1,爲比較理想的狀況。若是命中率很低,比值也徘徊在1:1,那說明緩存沒什麼卵用,仍是關了吧。
緩存優化思路:
使用緩存時如何可以讓緩存命中,提升緩存的有效性:
一、批量寫入而非屢次單個寫入,這樣便可僅一次的影響緩存
二、過大的緩存空間,可能會使大量的緩存失效時致使形成服務器假死,因此緩存空間不宜過大
三、必要時,使用SQL_NO_CACHE手動控制緩存
四、對寫密集型的應用場景來講,禁用緩存反而能提升性能