Mysql 数据库缓存 cache 功能

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Mysql 数据库缓存 cache 功能

mysql cache 功能分析:

1 mysql 的 cache 功能的 key 的生成原理是:把 select 语句按照一定的 hash 规则生成唯一的 key,select 的结果生成 value,即 key=>value。所以对于 cache 而言,select 语句是区分大小写的,也区分空格的。两个 select 语句必须完完全 全一致,才能够获取到同一个 cache。

2 生成 cache 之后,只要该 select 中涉及到的 table 有任何的数据变动 (insert,update,delete 操作等), 相 关的所有 cache 都会被删除。因此只有数据很少变动的 table,引入 mysql 的 cache 才较有意义。关于这方面的测试,可以参考:《Query Cache,看上去很美》一文。

所以,mysql 的 cache 功能只适用于下列场合:数据变动较少,select 较多的 table。

那么。在复杂的系统中,如何使用 mysql 的 cache 功能呢,基本方法如下:

配置 query_cache_type,同时改写程序。

query_cache_type 0 代表不使用缓冲, 1 代表使用缓冲,2 代表根据需要使用。

设置 1 代表缓冲永远有效,如果不需要缓冲,就需要使用如下语句:

SELECT SQL_NO_CACHE * FROM my_table WHERE …

如果设置为 2 ,需要开启缓冲,可以用如下语句:

SELECT SQL_CACHE * FROM my_table WHERE …

So,最简单又可靠的做法是:把 query_cache_type 设置为 2,然后在需要提高 select 速度的地方,使用:

SELECT SQL_CACHE * FROM…

的方式进行 SELECT。

【mysql cache 调试笔记】

1 可以使用下列命令开启 mysql 的 select cache 功能:

SET GLOBAL query_cache_size = 102400000;

因为当 query_cache_size 默认为 0 时,是不开启 cache 功能的。

2 调试:

查看 cache 的设置:

show variables like ‘%query_cache%’;

性能监控:

show status like ‘%Qcache%’;

3 mysql cache 的清理:

可以使用 FLUSH QUERY CACHE 语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。

RESET QUERY CACHE 语句从查询缓存中移出所有查询。FLUSH TABLES 语句也执行同样的工作。

Query Cache

当你的数据库打开了 Query Cache(简称 QC)功能后,数据库在执行 SELECT 语句时,会将其结果放到 QC 中,当下一次处理同样的 SELECT 请求时,数据库就会从 QC 取得结 果,而不需要去数据表中查询。

在这个 “Cache 为王” 的时代,我们总是通过不同的方式去缓存我们的结果从而提高响应效率,但一个缓存机制是否有效,效果如何,却是一个需要好好 思考的问题。在 MySQL 中的 Query Cache 就是一个适用较少情况的缓存机制。在上图中,如果缓存命中率非常高的话,有测试表明在极端情况下可以提高效率 238%[1]。 但实际情况如何?Query Cache 有如下规则,如果数据表被更改,那么和这个数据表相关的全部 Cache 全部都会无效,并删除之。这里 “数据表更改” 包括: INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, orDROP DATABASE 等。举 个例子,如果数据表 posts 访问频繁,那么意味着它的很多数据会被 QC 缓存起来,但是每一次 posts 数据表的更新,无论更新是不是影响到了 cache 的数据,都会将全部和 posts 表相关的 cache 清除。如果你的数据表更新频繁的话,那么 Query Cache 将会成为系统的负担。有实验表明,糟糕时,QC 会降低系统 13%[1] 的处理能力。

如果你的应用对数据库的更新很少,那么 QC 将会作用显著。比较典型的如博客系统,一般博客更新相对较慢,数据表相对稳定不变,这时候 QC 的作用会比 较明显。

再如,一个更新频繁的 BBS 系统。下面是一个实际运行的论坛数据库的状态参数:

QCache_hit 5280438 QCache_insert 8008948 Qcache_not_cache 95372 Com select 8104159 可以看到,数据库一共往 QC 中写入了约 800W 次缓存,但是实际命中的只有约 500W 次。也就是说,每一个缓存的使用率约为 0.66 次。很难说,该 缓存的作用是否大于 QC 系统所带来的开销。但是有一点是很肯定的,QC 缓存的作用是很微小的,如果应用层能够实现缓存,将可以忽略 QC 的效果。

————- 下面是关于 QC 的一些其他细节 —————–

一、Query Cache 相关参数:

query_cache_size QC 占用空间大小,通过将其设置为 0 关闭 QC 功能 query_cache_type 0 表示关闭 QC;1 表示正常缓存;2 表示 SQL_CACHE 才缓存 query_cache_limit 最大缓存结果集 query_cache_min_res_unit 手册上说,QC 会按照这个值分配缓存 block 的大小。 Qcache_lowmem_prunes 这是一个状态变量 (show status),当缓存空间不够需要释放旧的缓存时,该值会自增。

二、Query Cache 观察:

CREATE TABLE t1 (id INT,var1 varchar (10)); //Com_select:8 Qcache_hits:1 INSERT INTO t1 VALUES (1,’WWW’); //Com_select:8 Qcache_hits:1 SELECT * FROM t1 WHERE id=1; //Com_select:9 Qcache_hits:1 SELECT * FROM t1 WHERE id=1; //Com_select:9 Qcache_hits:2 Qcache_queries_in_cache:1 INSERT INTO t1 VALUES (2,’RRRR’); //Com_select:9 Qcache_hits:2 Qcache_queries_in_cache:0 SELECT * FROM t1 WHERE id=1; //INSERT 后 Cache 失效 //Com_select:10 Qcache_hits:2 Qcache_queries_in_cache:1

参考:

http://dev.mysql.com/doc/refman/5.0/en/query-cache.htmlhttp://dev.mysql.com/doc/refman/5.0/en/server-system-variables.htmlhttp://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
18天前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
104 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
3月前
|
自然语言处理 关系型数据库 MySQL
mysql 全文搜索功能优缺点
mysql 全文搜索功能优缺点
|
23天前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
20天前
|
缓存 NoSQL 关系型数据库
mysql和缓存一致性问题
本文介绍了五种常见的MySQL与Redis数据同步方法:1. 双写一致性,2. 延迟双删策略,3. 订阅发布模式(使用消息队列),4. 基于事件的缓存更新,5. 缓存预热。每种方法的实现步骤、优缺点均有详细说明。
|
21天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
32 1
|
23天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
34 0
|
23天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
22 0
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
64 2
|
2月前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
54 1

热门文章

最新文章