一、Mysql緩存:
1、緩存包括:
(1)、緩存查詢計劃避免二次詞法文法解析、優化、執行。
(2)、緩存mysql查詢語句傳回的完整結果,被命中時,mysql會了解傳回結果,省去解析、優化和執行等步驟。
2、如何命中緩存?
mysql儲存結果于緩存中:把select語句本身做hash計算,計算的結果作為key,查詢結果作為value
是以在寫sql語句時,大小寫以及順序等要統一,這樣緩存的幾率就大。
3、什麼樣的語句不會被緩存?
查詢語句中有一些不确定資料時,不會緩存:如NOW(),CURRENT_TIME();
一般來說,如果查詢中包含使用者自定義函數、存儲函數、使用者變量、臨時表、
mysql庫中系統表或者權限表,一般都不會被緩存。
4、緩存帶來的額外開銷?
每個查詢都得先檢查是否命中。
查詢結果要先緩存。
5、與緩存相關的變量:
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 |
(1)、query_cache_type:是否開啟緩存功能,
其值有三種ON|OFF|DEMAND,
其中DEMAND如果要緩存需要在select語句中需要顯示指明 sql_cache
(2)、query_cache_size:
緩存總空間,機關位元組,大小必須為1024的整數倍,從上面可以看出預設16M。
如果變更大小,會清空目前緩存,是以最好開始就設定好。
(3)、query_cache_min_res_unit:存儲緩存的最小記憶體塊。
(query_cahce_size-Qcache_free_memory)/Qcache_queries_in_cache
即(緩存總空間-空閑緩存空間)/緩存個數
(4)、query_cache_limit:
單個緩存對象的最大值,超過則不緩存。從上面可以看出預設1M。
可以手動使用sql_no_cache人為地避免嘗試緩存傳回查詢結果超出此參數限定值的語句。
(5)、query_cache_wlock_invalidate:
如果某表被其他使用者連接配接鎖住了,是否仍然從緩存中傳回結果,OFF為傳回,建議使用OFF傳回。
6、如果判斷緩存命中率:
(1)、mysql>show global status like 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16757128 |
| Qcache_hits | 3 |
| Qcache_inserts | 2 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 29 |
| Qcache_queries_in_cache | 2 |
| Qcache_total_blocks | 6 |
Qcache_hits :命中緩存的次數。
Qcache_inserts:寫入緩存的次數。
Qcache_free_memory:空閑緩存空間。
Qcache_total_blocks:已申請的塊數。
Qcache_free_blocks:空閑塊數。
Qcache_queries_in_cache:緩存個數
Qcache_not_cached:未被緩存個數
Qcache_lowmem_prunes:因緩存總空間太小,進行修減(騰出老緩存的次數)記憶體的次數。
(2)、命中率名額:
(2.1)、次數命中率:Qcache_hits/(Com_select+Qcache_hits),這個名額隻供參考。
mysql>show global status where variable_name='Qcache_hits' or variable_name='Com_select';
+---------------+-------+
| Variable_name | Value |
| Com_select | 35 |
| Qcache_hits | 3 |
(2.2)、命中率的一個重要參考名額:命中和寫入的比率,即Qcache_hits/Qcache_inserts的值,
此值如果大于3:1,則表明緩存也是有效,能達到10:1,則比較理想;否則關閉緩存比較好。
7、碎片整理:
FLUSH QUERY_CACHE
8、清空緩存:
RESET QUERY_CACHE
9、緩存優化思路:
(1)、批量寫入,可以提高緩存命中率。
(2)、緩存空間不宜過大,否則會因為大量緩存同時失效造成伺服器假死。
(3)、必要時使用SQL_CACHE或SQL_NO_CACHE手動控制緩存。
(4)、對寫密集型應用場景來說,禁用緩存反而提高性能。
本文轉自lzf0530377451CTO部落格,原文連結: http://blog.51cto.com/8757576/1732551,如需轉載請自行聯系原作者