mysql查詢緩存

工作原理

緩存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等存儲中間件更好的替代

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