MySQL 查询缓存 和缓存的了解

MySQL 查询缓存

MySQL 查询缓存是查询结果缓存。执行查询语句的时候,会先查询缓存,如果缓存中有对应的查询结果,就会直接返回。

my.cnf 加入以下配置,重启 MySQL 开启查询缓存

sql 复制代码
query_cache_type=1
query_cache_size=600000

MySQL 执行以下命令也可以开启查询缓存

sql 复制代码
set global  query_cache_type=1;
set global  query_cache_size=600000;

查询缓存会在同样的查询条件和数据情况下,直接返回缓存中的结果。但需要注意的是,查询缓存的匹配条件非常严格,任何细微的差异都会导致缓存无法命中。这里的查询条件包括查询语句本身、当前使用的数据库、以及其他可能影响结果的因素,如客户端协议版本号等。

查询缓存不命中的情况:

  1. 任何两个查询在任何字符上的不同都会导致缓存不命中。
  2. 如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果也不会被缓存。
  3. 缓存建立之后,MySQL 的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。

缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。 因此,开启查询缓存要谨慎,尤其对于写密集的应用来说更是如此。如果开启,要注意合理控制缓存空间大小,一般来说其大小设置为几十 MB 比较合适。此外,还可以通过 sql_cachesql_no_cache 来控制某个查询语句是否需要缓存:

sql 复制代码
SELECT sql_no_cache COUNT(*) FROM usr;

MySQL 5.6 开始,查询缓存已默认禁用。MySQL 8.0 开始,已经不再支持查询缓存了

MySQL 8.0:为什么会取消对查询缓存的支持?

尽管 MySQL 查询缓存旨在提高性能,但它存在严重的可扩展性问题,很容易成为严重的瓶颈。

这确实是我们在 MySQL 团队中观察到一段时间的事情。在我们进入今天文章的主题之前,让我先做一个介绍。

查询缓存简介

MySQL 查询缓存是查询结果缓存。它将以 SEL 开头的传入查询哈希表进行比较,如果存在匹配项,则返回上一次执行查询的结果。有一些限制:

  • 查询必须逐字节匹配(查询缓存避免解析)
  • 使用非确定性功能将导致查询不被缓存(包括临时表、用户变量、RAND()、NOW() 和 UDF)。
  • 查询缓存设计为不提供过时的结果。对基础表的任何修改都会导致这些表的所有缓存失效。
  • 对于缓存是否可以用于 InnoDB 有一些限制(为了尊重 MVCC;由于您打开了一个事务,因此"缓存"可能无法表示预期视图中的数据。

最佳情况:

查询缓存的理想方案往往在很大程度上是只读的,其中有许多非常昂贵的查询,这些查询检查数百万行,只返回少数行。一个假设的示例可能是一个复杂的查询,用于为始终显示在网页表单上的下拉列表构建值列表。在这种情况下,查询缓存可以掩盖由缺失索引导致的性能问题,这对新手用户很有帮助。

  • 在 MySQL 服务器中,我们现在能够重写查询以插入提示(或其他修改以提高性能)
  • 我们有 ProxySQL 等第三方工具,它们可以充当中间人查询缓存。ProxySQL 还支持用于缓存的 TTL,这在我之前提供的示例中工作正常(为下拉列表构建值列表)。

查询缓存的限制

自 MySQL 5.6 (2013) 以来,查询缓存已默认处于禁用状态,因为众所周知,它不会随多核计算机上的高吞吐量工作负载一起扩展 。Rene 昨天在他的帖子中证实了这一点,但 Stewart SmithDomas Mituzas(更新:和 Kristian Koehntopp)之前也提到过这一点。

假设可以提高可伸缩性,则查询缓存的限制因素是,因为只有命中缓存的查询才会得到改进;它不太可能提高性能的可预测性。 对于面向用户的系统,减少性能的可变性 通常比提高峰值吞吐量更重要:

决定删除对查询缓存的支持

我们同意密歇根大学安娜堡分校的 Jiamin Huang、Barzan Mozafari、Grant Schoenebeck、Thomas F. Wenisch 进行的研究。我们考虑了我们可以对查询缓存 进行哪些改进,以及我们可以进行哪些优化,从而为所有工作负载提供改进。

虽然这些选择本身是正交的,但工程资源是有限的。也就是说,我们正在转变战略,投资于更普遍适用于所有工作负载的改进。

我们也同意 Rene 的结论,即当缓存更靠近 Client 端时,缓存会提供最大的好处

相关推荐
丶意冷22 分钟前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
时序数据说2 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
戒不掉的伤怀2 小时前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql
cv高级工程师YKY2 小时前
服务器 - - QPS与TPS介绍
数据库
nbsaas-boot2 小时前
高可扩展属性建模设计:架构师的全局思考与落地方案
数据库
爱上语文3 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
陈敬雷-充电了么-CEO兼CTO4 小时前
推荐算法系统系列>推荐数据仓库集市的ETL数据处理
大数据·数据库·数据仓库·数据挖掘·数据分析·etl·推荐算法
MeshddY4 小时前
(超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)
c语言·数据库·单片机
wuxinyan1234 小时前
Java面试题033:一文深入了解MySQL(5)
java·数据库·mysql·面试
笑衬人心。4 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu