mysql缓存 碎片_Mysql查询缓存碎片、缓存命中率及Nagios监控
Mysql?的優(yōu)化方案,在互聯(lián)網(wǎng)上可以查找到非常多資料,今天對(duì)Mysql緩存碎片和命中率作了詳細(xì)了解,個(gè)人作了簡(jiǎn)單整理。
一、Mysql查詢緩存碎片和緩存命中率。
mysql> SHOW STATUS LIKE 'qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 5 |
| Qcache_free_memory | 134176648 |
| Qcache_hits | 110 |
| Qcache_inserts | 245 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 7119 |
| Qcache_queries_in_cache | 9 |
| Qcache_total_blocks | 31 |
+-------------------------+-----------+
8 rows in set (0.01 sec)
MySQL?查詢緩存變量
變量名
說(shuō)明
Qcache_free_blocks
緩存中相鄰內(nèi)存塊的個(gè)數(shù)。數(shù)目大說(shuō)明可能有碎片。FLUSH?QUERY?CACHE會(huì)對(duì)緩存中的碎片進(jìn)行整理,從而得到一個(gè)空閑塊。
Qcache_free_memory
緩存中的空閑內(nèi)存。
Qcache_hits
每次查詢?cè)诰彺嬷忻袝r(shí)就增大。
Qcache_inserts
每次插入一個(gè)查詢時(shí)就增大。命中次數(shù)除以插入次數(shù)就是不中比率;用?1減去這個(gè)值就是命中率。在上面這個(gè)例子中,大約有87%的查詢都在緩存中命中。
Qcache_lowmem_prunes
緩存出現(xiàn)內(nèi)存不足并且必須要進(jìn)行清理以便為更多查詢提供空間的次數(shù)。這個(gè)數(shù)字最好長(zhǎng)時(shí)間來(lái)看;如果這個(gè)數(shù)字在不斷增長(zhǎng),就表示可能碎片非常嚴(yán)重,或者內(nèi)存很少。(上面的?free_blocks和free_memory可以告訴您屬于哪種情況)。
Qcache_not_cached
不適合進(jìn)行緩存的查詢的數(shù)量,通常是由于這些查詢不是?SELECT語(yǔ)句。
Qcache_queries_in_cache
當(dāng)前緩存的查詢(和響應(yīng))的數(shù)量。
Qcache_total_blocks
緩存中塊的數(shù)量。
mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 134217728 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+-----------+
6 rows in set (0.00 sec)
query_cache_min_res_unit????查詢緩存分配的最小塊的大小(字節(jié))
query_alloc_block_size????為查詢分析和執(zhí)行過(guò)程中創(chuàng)建的對(duì)象分配的內(nèi)存塊大小
Qcache_free_blocks????代表內(nèi)存自由塊的多少,反映了內(nèi)存碎片的情況
==========================
1)當(dāng)查詢進(jìn)行的時(shí)候,Mysql把查詢結(jié)果保存在qurey?cache中,但如果要保存的結(jié)果比較大,超過(guò)query_cache_min_res_unit的值?,這時(shí)候mysql將一邊檢索結(jié)果,一邊進(jìn)行保存結(jié)果,所以,有時(shí)候并不是把所有結(jié)果全部得到后再進(jìn)行一次性保存,而是每次分配一塊query_cache_min_res_unit大小的內(nèi)存空間保存結(jié)果集,使用完后,接著再分配一個(gè)這樣的塊,如果還不不夠,接著再分配一個(gè)塊,依此類推,也就是說(shuō),有可能在一次查詢中,mysql要?進(jìn)行多次內(nèi)存分配的操作。
2)內(nèi)存碎片的產(chǎn)生。當(dāng)一塊分配的內(nèi)存沒有完全使用時(shí),MySQL會(huì)把這塊內(nèi)存Trim掉,把沒有使用的那部分歸還以重?復(fù)利用。比如,第一次分配4KB,只用了3KB,剩1KB,第二次連續(xù)操作,分配4KB,用了2KB,剩2KB,這兩次連續(xù)操作共剩下的1KB+2KB=3KB,不足以做個(gè)一個(gè)內(nèi)存單元分配,?這時(shí)候,內(nèi)存碎片便產(chǎn)生了。
3)使用flush?query?cache,可以消除碎片
4)如果Qcache_free_blocks值過(guò)大,可能是query_cache_min_res_unit值過(guò)大,應(yīng)該調(diào)小些
5)query_cache_min_res_unit的估計(jì)值:(query_cache_size?-?Qcache_free_memory)?/?Qcache_queries_in_cache
檢查查詢緩存使用情況
檢查是否從查詢緩存中受益的最簡(jiǎn)單的辦法就是檢查緩存命中率
當(dāng)服務(wù)器收到SELECT語(yǔ)句的時(shí)候,Qcache_hits和Com_select這兩個(gè)變量會(huì)根據(jù)查詢緩存
的情況進(jìn)行遞增
查詢緩存命中率的計(jì)算公式是:Qcache_hits/(Qcache_hits?+?Com_select)。
mysql>?show?status?like?'%Com_select%';
+---------------+-------+
|?Variable_name?|?Value?|
+---------------+-------+
|?Com_select????|?1?????|
+---------------+-------+
1?row?in?set?(0.00?sec)
此時(shí)的查詢緩存命中率:3/(3+1)=75%;由于個(gè)人的測(cè)試數(shù)據(jù)庫(kù),查詢較少,更行更少,命中率頗高。
http://blog.chinaunix.net/uid-25266990-id-3426963.html
總結(jié)
以上是生活随笔為你收集整理的mysql缓存 碎片_Mysql查询缓存碎片、缓存命中率及Nagios监控的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: lsof查看进程占用文件_lsof命令查
- 下一篇: mysql 5.x数据库安装_Ubunt