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