Mysql 数据库缓存 cache 功能

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 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/

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
阿里云RDS云数据库全解析:产品功能、收费标准与活动参考
与云服务器ECS一样,关系型数据库RDS也是很多用户上云必买的热门云产品之一,阿里云的云数据库RDS主要包含RDS MySQL、RDS SQL Server、RDS PostgreSQL、RDS MariaDB等几个关系型数据库,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,帮助您解决数据库运维的烦恼。本文为大家介绍阿里云的云数据库 RDS主要产品及计费方式、收费标准以及活动等相关情况,以供参考。
|
6月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
532 5
|
3月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1548 10
|
4月前
|
SQL 存储 关系型数据库
MySQL功能模块探秘:数据库世界的奇妙之旅
]带你轻松愉快地探索MySQL 8.4.5的核心功能模块,从SQL引擎到存储引擎,从复制机制到插件系统,让你在欢声笑语中掌握数据库的精髓!
183 26
|
6月前
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
183 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
237 32
|
4月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
430 0
|
8月前
|
SQL Linux 数据库
【YashanDB知识库】崖山数据库Outline功能验证
本文来自YashanDB官网,主要测试了数据库优化器在不同场景下优先使用outline计划的功能。测试环境包括相同版本新增数据、绑定参数执行、单机主备架构以及数据库版本升级等场景。通过创建表、插入数据、收集统计信息和创建outline等步骤,验证了在各种情况下优化器均能优先采用存储的outline计划。测试结果表明,即使统计信息失效或数据库版本升级,outline功能依然稳定有效,确保查询计划的一致性和性能优化。详情可见[原文链接](https://www.yashandb.com/newsinfo/7488286.html?templateId=1718516)。
【YashanDB知识库】崖山数据库Outline功能验证
|
8月前
|
NoSQL 关系型数据库 MongoDB
Apifox与Apipost数据库连接功能详细对比,让接口管理更高效!
在现代软件开发中,数据库是应用运行的核心组件,接口管理工具则是连接和调试数据库的重要桥梁。本文对比了 Apifox 和 Apipost 两款工具的数据库连接功能。Apipost 支持全面的关系型与非关系型数据库(如 MySQL、Redis、MongoDB),功能强大且免费,适合复杂项目;而 Apifox 在关系型数据库支持上表现良好,但非关系型数据库(尤其是 Redis)功能有限且收费,更适合中小项目以关系型数据库为主的需求。根据项目需求选择合适的工具,可显著提升开发效率和稳定性。

热门文章

最新文章

推荐镜像

更多
下一篇
oss云网关配置