MySQL查詢緩存 mysql
用於保存MySQL查詢語句返回的完整結果,被命中時,sql
MySQL會當即返回結果,省去解析、優化和執行等階段緩存
併發查詢量很是大、cup核心數很是多時緩存並不必定有效bash
(多個線程會爭用存儲緩存的這段內存空間)服務器
如何檢查緩存???併發
MySQL保存結果與緩存中:ide
把select語句自己作hash計算,計算的結果做爲key,查詢結果做爲value函數
什麼樣的語句不會被緩存?性能
查詢語句中有一些不肯定數據時,不會緩存;例如now(),current_time();優化
通常來講,若是查詢中包含用戶自定義函數、存儲函數、用戶變量、臨時表、mysql庫中系統表、或者任何包含權限的表,通常都不會緩存
緩存會帶來額外開銷
一、每一個查詢都會先檢查是否命中
二、查詢結果要先緩存(寫緩存)
查看跟緩存相關的變量
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.對寫密集型的應用場景來講,禁用緩存反而提升性能。