Mysql 数据库缓存 cache 功能

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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
相关文章
|
1月前
|
存储 缓存 数据库
解决缓存与数据库的数据一致性问题的终极指南
解决缓存与数据库的数据一致性问题的终极指南
132 63
|
2月前
|
消息中间件 canal 缓存
项目实战:一步步实现高效缓存与数据库的数据一致性方案
Hello,大家好!我是热爱分享技术的小米。今天探讨在个人项目中如何保证数据一致性,尤其是在缓存与数据库同步时面临的挑战。文中介绍了常见的CacheAside模式,以及结合消息队列和请求串行化的方法,确保数据一致性。通过不同方案的分析,希望能给大家带来启发。如果你对这些技术感兴趣,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
134 6
项目实战:一步步实现高效缓存与数据库的数据一致性方案
|
2月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
3天前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
61 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
3月前
|
自然语言处理 关系型数据库 MySQL
mysql 全文搜索功能优缺点
mysql 全文搜索功能优缺点
|
9天前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
6天前
|
缓存 NoSQL 关系型数据库
mysql和缓存一致性问题
本文介绍了五种常见的MySQL与Redis数据同步方法:1. 双写一致性,2. 延迟双删策略,3. 订阅发布模式(使用消息队列),4. 基于事件的缓存更新,5. 缓存预热。每种方法的实现步骤、优缺点均有详细说明。
|
7天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
21 1
|
19天前
|
缓存 弹性计算 NoSQL
新一期陪跑班开课啦!阿里云专家手把手带你体验高并发下利用云数据库缓存实现极速响应
新一期陪跑班开课啦!阿里云专家手把手带你体验高并发下利用云数据库缓存实现极速响应