工作原理
緩存SELECT操作的結果集和SQL語句,key爲sql,value爲查詢結果集;
如果新的SELECT語句到了,以這個sql爲key去緩存中查詢,如果匹配,就把緩存的結果集返回;
匹配標準:與緩存的SQL語句是否完全一樣,sql中字母區分大小寫以及中間的空格,簡單理解爲存儲了一個key-value結構,key爲sql,value爲sql查詢結果,匹配時使用Java的String的equals(),例如:
select age from user 與 select AGE from user不會匹配,因爲大小寫不同;
select age from use 與 select age from user不會匹配,因爲空格不同;
sql兩邊的空格可忽略,可以認爲是對key進行過trim操作之後再進行equals比較。
查看mysql設置參數
執行
show variables like ‘query_cache’;
可以看到相關參數:
query_cache_type:0-不啓用查詢緩存;1-啓用,2-啓用,默認值爲0;
query_cache_size:設置緩存區總大小,允許設置query_cache_size的值最小爲40K,默認1M,推薦設置爲:64M/128M;
query_cache_limit:限制緩存區最大能緩存的單條查詢記錄集大小,默認設置爲1M
query_cache_type爲1時,只要符合查詢緩存的要求,客戶端的查詢語句和記錄集都可以緩存起來,如果SQL中加上 SQL_NO_CACHE將不緩存;
query_cache_type爲2時,只要SQL中添加了參數:SQL_CACHE,且符合查詢緩存的要求,客戶端的查詢語句和記錄集,則可以緩存起來。
查看緩存使用情況
show status like 'Qcache%'
可以看到相關參數:
Qcache_hits:緩存命中次數;
Qcache_inserts:緩存中插入次數,每緩存一次加1,注意這個不是緩存數量;
不會緩存的情況
當查詢語句中有一些不確定的數據時,則不會被緩存。如包含函數NOW(),CURRENT_DATE()等類似的函數,或者用戶自定義的函數,存儲函數,用戶變量等都不會被緩存
當查詢的結果大於query_cache_limit設置的值時,結果不會被緩存
對於InnoDB引擎來說,當一個語句在事務中修改了某個表,那麼在這個事務提交之前,所有與這個表相關的查詢都無法被緩存。因此長時間執行事務,會大大降低緩存命中率
查詢的表是系統表,如select * from mysql
查詢語句不涉及表,例如select 1
mysql默認關閉查詢緩存
mysql默認是關閉查詢緩存的,也就是query_cache_type默認爲0。基於以下幾點考慮:
開啓緩存之後,在查詢之前必須先檢查是否命中緩存,浪費計算資源
如果這個查詢可以被緩存,那麼執行完成後,MySQL發現查詢緩存中沒有這
個查詢,則會將結果存入查詢緩存,這會帶來額外的系統消耗
針對表進行寫入或更新數據時,會將對應表的所有緩存都設置失效,可能剛緩存就失效了。
如果查詢緩存很大或者碎片很多時,這個操作可能帶來很大的系統消耗。
作用可以被redis等存儲中間件更好的替代