mysql查詢緩存命中率
工作原理:
查詢緩存的工作原理,基本上可以概括為: 緩存SELECT操作或預處理查詢(註釋:5.1.17開始支持)的結果集和SQL語句; 新的SELECT語句或預處理查詢語句,先去查詢緩存,判斷是否存在可用的記錄集,判斷標準:與緩存的SQL語句,是否完全一樣,區分大小寫;
查詢緩存對什麽樣的查詢語句,無法緩存其記錄集,大致有以下幾類:
1、 查詢語句中加了SQL_NO_CACHE參數;
2、查詢語句中含有獲得值的函數,包涵自定義函數,如:CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ等;
3、 對系統數據庫的查詢:mysql、information_schema 查詢語句中使用SESSION級別變量或存儲過程中的局部變量;
4、查詢語句中使用了LOCK IN SHARE MODE、FOR UPDATE的語句 查詢語句中類似SELECT …INTO 導出數據的語句;
5、對臨時表的查詢操作; 存在警告信息的查詢語句; 不涉及任何表或視圖的查詢語句; 某用戶只有列級別權限的查詢語句;
6、 事務隔離級別為:Serializable情況下,所有查詢語句都不能緩存;
配置
是否啟用mysql查詢緩存,可以通過2個參數:query_cache_type和query_cache_size,其中任何一個參數設置為0都意味著關閉查詢緩存功能。
query_cache_type 值域為:
0(OFF):關閉 Query Cache 功能,任何情況下都不會使用 Query Cache;
1(ON): 啟用查詢緩存,只要符合查詢緩存的要求,客戶端的查詢語句和記錄集鬥可以 緩存起來,共其他客戶端使用;
2(DEMAND): 啟用查詢緩存,只要查詢語句中添加了參數:sql_cache,且符合查詢緩存的要求,客戶端的查詢語句和記錄集,則可以緩存起來,共其他客戶端使用;
query_cache_size 允許設置query_cache_size的值最小為40K,對於最大值則可以幾乎認為無限制,實際生產環境的應用經驗告訴我們,該值並不是越大, 查詢緩存的命中率就越高,也不是對服務器負載下降貢獻大,反而可能抵消其帶來的好處,甚至增加服務器的負載,至於該如何設置,下面的章節講述,推薦設置 為:64M;建議設置不要超過256MB
緩存選項的說明:
用show global status like ‘QCache%‘;查看
mysql> show global status like ‘QCache%‘; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 1031368 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 83 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+---------+ 8 rows in set (0.02 sec)
Qcache_free_blocks:目前還處於空閑狀態的 Query Cache 中內存 Block 數目
Qcache_free_memory:目前還處於空閑狀態的 Query Cache 內存總量
Qcache_hits:Query Cache 命中次數
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數,也就是沒有命中的次數
Qcache_lowmem_prunes:當 Query Cache 內存容量不夠,需要從中刪除老的 Query Cache 以給新的 Cache 對象使用的次數
Qcache_not_cached:沒有被 Cache 的 SQL 數,包括無法被 Cache 的 SQL 以及由於 query_cache_type 設置的不會被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數量
Qcache_total_blocks:Query Cache 中總的 Block 數量
內存碎片的產生。當一塊分配的內存沒有完全使用時,MySQL會把這塊內存Trim掉,把沒有使用的那部分歸還以重 復利用。比如,第一次分配4KB,只用了3KB,剩1KB,第二次連續操作,分配4KB,用了2KB,剩2KB,這兩次連續操作共剩下的 1KB+2KB=3KB,不足以做個一個內存單元分配, 這時候,內存碎片便產生了。使用flush query cache,可以消除碎片
下面是命中率和內存使用率的一些算法
query_cache_min_res_unit的估計值:(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
查詢緩存命中率 ≈ (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
查詢緩存內存使用率 ≈ (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
InnoDB存儲引擎的緩沖池
通常InnoDB存儲引擎緩沖池的命中不應該小於99%,如:
mysql> show global status like ‘innodb%read%‘\G *************************** 1. row *************************** Variable_name: Innodb_buffer_pool_read_ahead_rnd Value: 0 *************************** 2. row *************************** Variable_name: Innodb_buffer_pool_read_ahead Value: 0 *************************** 3. row *************************** Variable_name: Innodb_buffer_pool_read_ahead_evicted Value: 0 *************************** 4. row *************************** Variable_name: Innodb_buffer_pool_read_requests Value: 81337 *************************** 5. row *************************** Variable_name: Innodb_buffer_pool_reads Value: 432 *************************** 6. row *************************** Variable_name: Innodb_data_pending_reads Value: 0 *************************** 7. row *************************** Variable_name: Innodb_data_read Value: 9261056 *************************** 8. row *************************** Variable_name: Innodb_data_reads Value: 450 *************************** 9. row *************************** Variable_name: Innodb_pages_read Value: 431 *************************** 10. row *************************** Variable_name: Innodb_rows_read Value: 290 10 rows in set (0.15 sec)
參數說明:
Innodb_buffer_pool_reads: 表示從物理磁盤讀取頁的次數
Innodb_buffer_pool_read_ahead: 預讀的次數
Innodb_buffer_pool_read_ahead_evicted: 預讀的頁,但是沒有讀取就從緩沖池中被替換的頁的數量,一般用來判斷預讀的效率
Innodb_buffer_pool_read_requests: 從緩沖池中讀取頁的次數
Innodb_data_read: 總共讀入的字節數
Innodb_data_reads: 發起讀取請求的次數,每次讀取可能需要讀取多個頁
Innodb緩沖池命中率計算:
從上面信息可以求得:
mysql> select 81337/(81337+0+432); +---------------------+ | 81337/(81337+0+432) | +---------------------+ | 0.9947 | +---------------------+ 1 row in set (0.00 sec)
mysql查詢緩存命中率