LSRONG-双荣设计
扫描二维码添加QQ好友

扫一扫二维码,加我QQ

MySQL 缓存 Query Cache使用 分析

2016-03-27 11:03:10ecshop常见问题

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*FROMpeoplewherename='surfchen';

select*FROMpeoplewhere/*hey~*/name='surfchen';

SELECT*FROMpeoplewherename='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。比方用来查询用户和密码的语句——“selectpassfromuserwherename='surfchen'”。这样的语句,在一个零碎里,很有能够只在一个用户登陆的时辰被运用。每个用户的登陆所用到的查询,都是不一样的SQL文本,QC在这里就几乎不起作用了,由于缓存的数据几乎是不会被用到的,它们只会在内存里占地点。

文章关键词