MySQL 缓存 Query Cache[MySQL防范]
本文“MySQL 缓存 Query Cache[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
QueryCache(下面简称QC)是按照SQL语句来cache的.一个SQL查询假如以select开首,那么MySQL服务器将尝试对其使 用QC.每个Cache都是以SQL文本作为key来存的.在利用QC之前,SQL文本不会被作任何处理.也就是说,两个SQL语句,只要相差哪怕是一个 字符(比方大小写不一样;多一个空格等),那么这两个SQL将利用差别的一个CACHE.
不过SQL文本有大概会被客户端做一些处理.比方在官方的号令行客户端里,在发送SQL给服务器之前,会做以下处理:
过滤全部注释
去掉SQL文本前後的空格,TAB等字符.注意,是文本前面和後面的.中间的不会被去掉.
下面的三条SQL里,因 为SELECT大小写的关系,最後一条和其他两条在QC里必定是用的不一样的存储位置.而第一条和第二条,辨别在于後者有个注释,在差别客户端,会有不一 样的后果.所以,保险起见,请尽大概不要利用动态的注释.在PHP的mysql扩大里,SQL的注释是不会被去掉的.也就是三条SQL会被存储在三个差别的 缓存里,固然它们的后果都是一样的.
select * FROM people where name='surfchen';
select * FROM people where /*hey~*/name='surfchen';
SELECT * FROM people where name='surfchen';
目前只有select语句会被cache,其他近似show,use的语句则不会被cache.
因为QC是如此前端,如此简单的一个缓存系统,所以假如一个表被更新,那么和这个表相关的SQL的全部QC城市被失效.假定一个结合查询里触及到了表A和表B,假如表A大概表B的此中一个被更新(update大概delete),这个查询的QC将会失效.
也就是说,假如一个表被频繁更新,那么就要考虑清楚毕竟能否应当对相关的一些SQL举行QC了.一个被频繁更新的表假如被利用了QC,大概会加重数 据库的负担,而不是减轻负担.我普通的做法是默许翻开QC,而对一些触及频繁更新的表的SQL语句加上SQL_NO_CACHE关键词来对其禁用 CACHE.这样可以尽大概避免不必要的内存操作,尽大概保持内存的持续性.
那些查询很分离的SQL语句,也不该该利用QC.比方用来查询用户和密码的语句——“select pass from user where name='surfchen'”.这样的语句,在一个系统里,很有大概只在一个用户登陆的时刻被利用.每个用户的登陆所用到的查询,都是不一样的SQL 文本,QC在这里就几近不起作用了,因为缓存的数据几近是不会被用到的,它们只会在内存里占地方.
存储块
在本节里“存储块”和“block”是同一个意思
QC缓存一个查询后果的时刻,普通情形下不是一次性地分配充足多的内存来缓存后果的.而是在查询后果得到的历程中,逐块存储.当一个存储块被填满之 後,一个新的存储块将会被成立,并分配内存(allocate).单个存储块的内存分配大小通过query_cache_min_res_unit参数控 制,默许为4KB.最後一个存储块,假如不能被全部操纵,那么没利用的内存将会被释放.假如被缓存的后果很大,那么会大概会招致分配内存操作太频繁,系统 系能也随之下降;而假如被缓存的后果都很小,那么大概会招致内存碎片过量,这些碎片假如太小,就很有大概不能再被分配利用.
除了查询后果需求存储块之外,每个SQL文本也需求一个存储块,而触及到的表也需求一个存储块(表的存储块是全部线程同享的,每个表只需求一个存储 块).存储块总数目=查询后果数目*2+触及的数据库表数目.也就是说,第一个缓存生成的时刻,至少需求三个存储块:表信息存储块,SQL文本存储块,查 询后果存储块.而第二个查询假如用的是同一个表,那么最少只需求两个存储块:SQL文本存储块,查询后果存储块.
通过察看Qcache_queries_in_cache和Qcache_total_blocks可以知道平均每个缓存后果占用的存储块.它们的 比比方果接近1:2,则阐明当前的query_cache_min_res_unit参数已经充足大了.假如Qcache_total_blocks比 Qcache_queries_in_cache多很多,则需求增添query_cache_min_res_unit的大小.
Qcache_queries_in_cache*query_cache_min_res_unit(sql文本和表信息所在的block占用的 内存很小,可以忽视)假如远宏大于query_cache_size-Qcache_free_memory,那么可以尝试减小 query_cache_min_res_unit的值.
调整大小
假如Qcache_lowmem_prunes增长疾速,意味着很多缓存因为内存不够而被释放,而不是因为相关表被更新.尝试加大query_cache_size,尽大概使Qcache_lowmem_prunes零增长.
启动参数
show variables like 'query_cache%'可以看到这些信息.
query_cache_limit
假如单个查询后果大于这个值,则不Cache
query_cache_size
分 配给QC的内存.假如设为0,则相当于禁用QC.要注意QC必须利用大约40KB来存储它的构造,假如设定小于40KB,则相当于禁用QC.QC存储的最 小单位是1024 byte,所以假如你设定了一个不是1024的倍数的值,这个值会被四舍五入到最接近当前值的等于1024的倍数的值.
query_cache_type
0 完好禁止QC,不受SQL语句掌握(别的大概要注意的是,即便这里禁用,上面一个参数所设定的内存大小还是会被分配);1启用QC,可以在SQL语句利用SQL_NO_CACHE禁用;2可以在SQL语句利用SQL_CACHE启用.
query_cache_min_res_unit
每次给QC后果分配内存的大小
状况
show status like 'Qcache%'可以看到这些信息.
Qcache_free_blocks
当一个表被更新之後,和它相关的cache blocks将被free.但是这个block仍然大概存在行列中,除非是在行列的尾部.这些blocks将会被统计到这个值来.可以用FLUSH QUERY CACHE语句来清空free blocks.
Qcache_free_memory
可用内存,假如很小,考虑增添query_cache_size
Qcache_hits
自mysql进程启动起,cache的命中数目
Qcache_inserts
自mysql进程启动起,被增添进QC的数目
Qcache_lowmem_prunes
由于内存过少而招致QC被删除的条数.加大query_cache_size,尽大概保持这个值0增长.
Qcache_not_cached
自mysql进程启动起,没有被cache的只读查询数目(包含select,show,use,desc等)
Qcache_queries_in_cache
当前被cache的SQL数目
Qcache_total_blocks
在 QC中的blocks数.一个query大概被多个blocks存储,而这几个blocks中的最後一个,未用满的内存将会被释放掉.比方一个QC后果要 占6KB内存,假如query_cache_min_res_unit是4KB,则最後将会生成3个blocks,第一个block用来存储sql语句文 本,这个不会被统计到query+cache_size里,第二个block为4KB,第三个block为2KB(先allocate4KB,然後释放多 馀的2KB).每个表,当第一个和它有关的SQL查询被CACHE的时刻,会利用一个block来存储表信息.也就是说,block会被用在三处地方:表 信息,SQL文本,查询后果.
排序缓冲
当一个查询需求对后果举行排序的时刻,MySQL会分配一定的内存用来排序.这个内存大小由sort_buffer_size来掌握.记得,这个参数是针对每个查询的,而不是全部查询总共可分配的量.
假如sort_buffer_size不够大,排序的后果将会被分段写入暂时文件里.每次完毕之後再把文件中的排序后果拿出来归并,举行再次排序, 直到得出最後后果.sort_buffer_size越小,归并的次数就越多.归并次数可以通过状况变量Sort_merge_passes得到.理论 上,Sort_merge_passes越小,排序越快.但是在实际利用中大概并非如此.sort_buffer_size若何设置需求按照实际运行环境 来举行测试.假照实在不知道若何测试,那么就设到使Sort_merge_passes为0吧.
read_buffer_size read_rnd_buffer_size join_buffer_size thread_cache
字段挑选
从二进制角度考虑
select col1,col2 from table PROCEDURE ANALYSE();,这条语句可以按照当前表的内容来给出一个字段范例的举荐.
MyISAM
key_buffer_size
CACHE INDEX Syntax
innodb
innodb_buffer_pool_size
这是和innodb有关的最重要的一个参数.这个参数指定了innodb缓存池的大小.这个缓存池被用来存储
innodb_file_per_table innodb_additional_mem_pool_size=80M innodb_log_file_size=1G innodb_log_buffer_size=16M innodb_flush_method=O_DIRECT
(max_connections * (sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size)) + key_buffer + innodb_bufer_pool_size + query_cache + tmp_table_size
系统相关
echo -n 0 >/proc/sys/vm/swappiness
huge page
memlock
优化工具
mysqltuner
以上是“MySQL 缓存 Query Cache[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |