阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

详解MySQL查询缓存

174次阅读
没有评论

共计 1468 个字符,预计需要花费 4 分钟才能阅读完成。

查询缓存是指存储使用 SELECT 语法查询到的返回到客户端的文本。当相同的请求再次发生时,会从查询缓存中获取数据,而非再执行一遍查询。查询缓存是共享 Session 会话的,所以一个客户端的请求可能与另一个客户端的请求得到相同的结果。

当服务器频繁收到相同的请求而数据库中的表数据变化频率又不高,查询缓存是非常有用的,它可以大大提高应用程序的访问效率。很多 Web 服务器利用这一原理基于数据库的内容动态生成页面。

查询缓存并不会返回过期的数据,当数据库中的表数据发生变化时,相关的查询缓存会自动清除。但是查询缓存并不会在多个 MySQLd 服务器实例中更新同一个表的数据时有效。

查询缓存对于存储在多个数据库分区表中的数据是无效的。如果查询涉及多个数据库分区表,查询缓存会自动失效。

如果要禁用查询缓存的话,只需在启动时将 query_cache_size 的大小设置为 0 即可。

查询缓存在一定情况下会提升系统的性能,但并不代表在任何情况下都会提升系统的性能,某些情况下,甚至可能会降低系统的性能。如

1)人们对于分级设置查询缓存的分歧很大,有些人认为可能超出了启用它的好处。查询缓存的大小设置为几十兆的时候通常是有效的,但是设置成几百兆的时候就不一定了。

2)在服务器超负荷时使用查询缓存是非常有效的。一个由多个 SELECT 组合成的复杂查询使用查询缓存的效率肯定是非常高效的,但如果有频繁插入数据的话,不使用缓存的话比起使用查询缓存效率要高的多。

查询缓存的执行原理

对于下面这两种查询,查询缓存会当作两种不同形式的查询,因为查询缓存会严格比较两次查询的字节是否完全相同。对于不同的字符串,不同的数据表,不同的协议版本,不同的字符集都会当作不同的查询。

SELECT * FROM tbl_name
Select * from tbl_name

在以下情况下并不适合使用查询缓存

1)查询是外部查询的一个子查询

2)在存储过程,触发器或函数中执行的查询

如果数据表发生变化,如增加 / 修改 / 删除表结构或表数据,都会导致查询缓存失效,缓存的数据会自动从缓存中清除。

当查询缓存包含了以下函数时,查询缓存并不会有效。

详解 MySQL 查询缓存

查询缓存不适用的情况

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,这是由它的系统结构所决定的。在应用时设置为多大合适,还是要根据实际情况而定。

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-04/130019.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计1468字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中