询缓存中,但如果要保存的结果比较大,超过query_cache_mi
_res_u
it的值,这时候MySQL会一边检索结果,一边保存结果,所以,有时候并不是把所有结果全部得到后再进行一次性保存,而是每次分配一块query_cache_mi
_res_u
it大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中,MySQL要进行多次内存分配的操作。当一块分配的内存没有完全使用时,MySQL会把这块内存截掉,把没有使用的那部分归还以重复利用,当连续操作后剩下的内存大小不足以分配一个内存单元时,内存碎片便产生了。通常无法避免所有的碎片,但是仔细选择Query_cache_mi
_res_u
it可以避免在查询缓存中造成大量的内存浪费,关键在于每一个新块和服务器已分配给存储结果的块的数量之间找到平衡,如果值过小,服务器将会浪费较少的内存,但会更频繁地分配块,这对服务器意味着更多的工作。如果值过大,碎片将会很多,合适的折中是在浪费内存和增加处理时间上取得平衡。空缓存百分比:Qcache_free_blocksQcache_total_blocks≈16,且系统Qcache_free_blocks值较高,有可能是出现碎片了,使用flushquerycache整
f理查询缓存并消除碎片,该命令不会从缓存中移除任何查询。同时定期观察内存碎片情况。
Key_buffer_size
Key_reads
Key_reads_requests
键缓存读命中率:100((Key_reads100)Key_reads_requests)99975Key_read_requests和Key_reads是两个计数器,Key_read_requests是从缓存读取索引的请求次数,Key_reads是从磁盘读取索引的请求次数。key_buffer_size指定MyISAM表索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。MyISAM键缓存默认只有一个缓冲区,MyISAM自身只缓存了索引,没有数据,它让操作系统缓存数据,它的值应该占到所有保留内存的25到50,操作系统缓存用来保存从MYD文件中读取出来的数据。该变量给键缓冲分配指定大小的空间,但是操作系统只有在实际用到这些空间的时候才会进行分配,也可以创建多个键缓存,如果对于一个非默认大小的键缓存设置为0,MySQL就会把每一个索引从特定的缓存移到默认的缓存中,并且在没有对象使用特定的缓存时就将其删掉,给一个不存在的缓存设置这个变量将会创建缓存,对一个已有的缓存设置非零值将会冲洗缓存,这是一个在线操作,它会阻止所有访问该缓存的动作,直到缓存冲洗完成。另一个参考指标是单位时间内Key_reads值的变化情况。
f系统使用MyISAM表查询频率较低,键缓存读命中率在99以上,表明键r