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在这里就几乎不起作用了,由于
缓存的数据几乎是不会被用到的,它们只会在内存里占地点
。