详解MySQL查询缓存
查询缓存是指存储使用SELECT语法查询到的返回到客户端的文本。当相同的请求再次发生时,会从查询缓存中获取数据,而非再执行一遍查询。查询缓存是共享Session会话的,所以一个客户端的请求可能与另一个客户端的请求得到相同的结果。
当服务器频繁收到相同的请求而数据库中的表数据变化频率又不高,查询缓存是非常有用的,它可以大大提高应用程序的访问效率。很多Web服务器利用这一原理基于数据库的内容动态生成页面。
查询缓存并不会返回过期的数据,当数据库中的表数据发生变化时,相关的查询缓存会自动清除。但是查询缓存并不会在多个mysqld服务器实例中更新同一个表的数据时有效。
查询缓存对于存储在多个数据库分区表中的数据是无效的。如果查询涉及多个数据库分区表,查询缓存会自动失效。
如果要禁用查询缓存的话,只需在启动时将query_cache_size的大小设置为0即可。
查询缓存在一定情况下会提升系统的性能,但并不代表在任何情况下都会提升系统的性能,某些情况下,甚至可能会降低系统的性能。如
1)人们对于分级设置查询缓存的分歧很大,有些人认为可能超出了启用它的好处。查询缓存的大小设置为几十兆的时候通常是有效的,但是设置成几百兆的时候就不一定了。
2)在服务器超负荷时使用查询缓存是非常有效的。一个由多个SELECT组合成的复杂查询使用查询缓存的效率肯定是非常高效的,但如果有频繁插入数据的话,不使用缓存的话比起使用查询缓存效率要高的多。
查询缓存的执行原理
对于下面这两种查询,查询缓存会当作两种不同形式的查询,因为查询缓存会严格比较两次查询的字节是否完全相同。对于不同的字符串,不同的数据表,不同的协议版本,不同的字符集都会当作不同的查询。
SELECT * FROM tbl_name Select * from tbl_name |
在以下情况下并不适合使用查询缓存
1)查询是外部查询的一个子查询
2)在存储过程,触发器或函数中执行的查询
如果数据表发生变化,如增加/修改/删除表结构或表数据,都会导致查询缓存失效,缓存的数据会自动从缓存中清除。
当查询缓存包含了以下函数时,查询缓存并不会有效。
查询缓存不适用的情况
1)查询使用用户自定义的函数或存储过程。
2)查询包含了用户变量或本地存储的程序变量。
3)涉及到数据库中的mysql,INFORMATION_SCHEMA和performance——schema表。
4)查询涉及到数据库分区表。
5)查询是如下的类型:
SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE SELECT ... INTO OUTFILE ... SELECT ... INTO DUMPFILE ... SELECT * FROM ... WHERE autoincrement_col IS NULL |
6)查询用到了临时表。
7)查询没有用到数据表。
8)查询包含了警告。
9)用户查询的表中拥有特定的权限。
使用查询缓存和不使用查询缓存的两种方式
SELECT SQL_CACHE id, name FROM customer; SELECT SQL_NO_CACHE id, name FROM customer; |
配置查询缓存
当查询缓存query_cache_size设置为一个非0的数值时,最小的容量是40KB,这是由它的系统结构所决定的。在应用时设置为多大合适,还是要根据实际情况而定。