標籤:
MySQL查詢快取
用於儲存MySQL查詢語句返回的完整結果,被命中時,MySQL會立即返回結果,省去解析、最佳化和執行等階段。
如何檢查緩衝?
MySQL儲存結果於緩衝中:
把SELECT語句本身做hash計算,計算結果為key,查詢結果作為value。
不會被緩衝的資料:
查詢語句中有一些不確定資料時,不會緩衝,例如NOW(),CURRENT_TIME(),一般來說,如果查詢中包含自訂函數、儲存函數、使用者變數、暫存資料表、mysql庫中系統資料表、或者任何包含許可權的表,一般都不會被緩衝。
緩衝會帶來額外開銷:
1、每個查詢都得先檢查是否命中;
2、檢查結果要先緩衝;
與緩衝相關的變數:
查看緩衝變數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,那說明緩衝沒什麼卵用,還是關了吧。
緩衝最佳化思路:
使用緩衝時如何能夠讓快取命中,提高緩衝的有效性:
1、批量寫入而非多次單個寫入,這樣即可僅一次的影響緩衝
2、過大的緩衝空間,可能會使大量的緩衝失效時導致造成伺服器假死,所以緩衝空間不宜過大
3、必要時,使用SQL_NO_CACHE手動控制緩衝
4、對寫密集型的應用情境來說,禁用緩衝反而能提高效能
MySQL查詢快取