在MySQL服务器端,针对SELECT操作做了查询结果的缓存,缓存查询的文本以及发送的结果。对于一个不经常更新并且需要频繁SELECT的表而言,这样的特性非常有用,比如一些相对稳定的web动态页面。
需要注意以下几点:
1.查询缓存不返回旧的数据。当表更改后,查询缓存值的相关条目被清空。
2. 如果有许多mysqld服务器更新相同的MyISAM(默认存储引擎)表,在这种情况下查询缓存不起作用。
3.查询缓存的SQL语句区分大小写
4.当一个表被更改后(如update、delete、insert等操作),该表所有的缓存都被清空
另外对部分select操作,并不做缓存处理,如下:
1.引用自定义函数(UDFs)。
2.引用自定义变量。
3.引用mysql系统数据库中的表。
4.下面方式中的任何一种:
SELECT ...IN SHARE MODE
SELECT ...FOR UPDATE
SELECT ...INTO OUTFILE ...
SELECT ...INTO DUMPFILE ...
SELECT * FROM ...WHERE autoincrement_col IS NULL
查询缓存可以通过选项SELECT SQL_CACHE。。。。或SELECT SQL_NO_CACHE。。。。来显式指定。
通过have_query_cache服务器系统变量指示查询缓存是否可用:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
此外还有个全局变量query_cache_size来指定高速缓存的大小,可以通过设置该变量来进行配置。
mysql> SET GLOBAL query_cache_size = ??;
注意,由于系统需要分配40KB大小的内存来分配数据结构,因此最好指定query_cache_size的值大于40KB。
但这里对query_cache_size值的设置将影响所有的用户,对于单个客户端,可通过设置会话的方式来对查询缓存进行控制:
mysql> SET SESSION query_cache_type = OFF;
要控制可以被缓存的具体查询结果的最大值,应设置query_cache_limit变量。 默认值是1MB。
看起来,查询缓存似乎放在共享存储区域,拥有权限的用户都可以进行读取。。。。(有待证实!!)