[MySQL FAQ]系列 — 线上环境到底要不要开启query cache

简介: [MySQL FAQ]系列 — 线上环境到底要不要开启query cache

Query Cache(查询缓存,以下简称QC)存储SELECT语句及其产生的数据结果,特别适用于:频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息。QC有可能会从InnoDB Buffer Pool或者MyISAM key buffer里读取结果。


由于QC需要缓存最新数据结果,因此表数据发生任何变化(INSERT、UPDATE、DELETE或其他可能产生数据变化的操作),都会导致QC被刷新。


根据MySQL官方的测试,QC的优劣分别是:

1、如果对一个表执行简单的查询,但每次查询都不一样的话,打开QC后,性能反而下降了13%左右。但通常实际业务中,通常不会只有这种请求,因此实际影响应该比这个小一些。


2、如果对一个只有一行数据的表进行查询,则可以提升238%,这个效果还是非常不错的。

因此,如果是在一个更新频率非常低而只读查询频率非常高的场景下,打开QC还是比较有优势的,其他场景下,则不建议使用。而且,QC一般也维持在100MB以内就够了,没必要设置超过数百MB。


QC严格要求2次SQL请求要完全一样,包括SQL语句,连接的数据库、协议版本、字符集等因素都会影响,下面几个例子中的SQL会被认为是完全不一样而不会使用同一个QC内存块:

mysql> set names latin1; SELECT * FROM table_name;

mysql> set names latin1; select * from table_name;

mysql> set names utf8; select * from table_name;


此外,QC也不适用于下面几个场景:

1、子查询或者外层查询;

2、存储过程、存储函数、触发器、event中调用的SQL,或者引用到这些结果的;

3、包含一些特殊函数时,例如:BENCHMARK()、CURDATE()、CURRENT_TIMESTAMP()、NOW()、RAND()、UUID()等等;

4、读取mysql、INFORMATION_SCHEMA、performance_schema 库数据的;

5、类似SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE、SELECT..INTO OUTFILE/DUMPFILE、SELECT..WHRE…IS NULL等语句;

6、SELECT执行计划用到临时表(TEMPORARY TABLE);

7、未引用任何表的查询,例如 SELECT 1+1 这种;

8、产生了 warnings 的查询;

9、SELECT语句里加了 SQL_NO_CACHE 关键字;


更加奇葩的是,MySQL在从QC中取回结果前,会先判断执行SQL的用户是否有全部库、表的SELECT权限,如果没有,则也不会使用QC。


相比下面这个,其实上面所说的都不重要。


最为重要的是,在MySQL里QC是由一个全局锁在控制,每次更新QC的内存块都需要进行锁定


例如,一次查询结果是20KB,当前 query_cache_min_res_unit 值设置为 4KB(默认值就是4KB,可调整),那么么本次查询结果共需要分为5次写入QC,每次都要锁定,可见其成本有多高。


我们可以通过 PROFILING 功能来查看 QC 相关的一些锁竞争,例如像下面这样的:

  • Waiting for query cache lock

  • Waiting on query cache mutex


或者,也可以通过执行 SHOW PROCESSLIST 来看线程的状态,例如:


• checking privileges on cached query

检查用户是否有权限读取QC中的结果集


• checking query cache for query

检查本次查询结果是否已经存储在QC中


• invalidating query cache entries

由于相关表数据已经修改了,因此将QC中的内存记录被标记为失效


• sending cached result to client

从QC中,将缓存后的结果返回给客户程序


• storing result in query cache

将查询结果缓存到QC中

如果可以频繁看到上述几种状态,那么说明当前QC基本存在比较重的竞争。


说了这么多废话,其实核心要点就一个:

如果线上环境中99%以上都是只读,很少有更新,再考虑开启QC吧,否则,就别开了。

关闭方法很简单,有两种:

1、同时设置选项 query_cache_type = 0query_cache_size = 0

2、如果用源码编译MySQL的话,编译时增加参数 --without-query-cache 即可;


延伸阅读:

http://www.dbasquare.com/kb/how-query-cache-can-cause-performance-problems/

http://www.percona.com/blog/2012/09/05/write-contentions-on-the-query-cache/

http://dev.mysql.com/doc/refman/5.6/en/query-cache.html

            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 SQL 安全
加密后的数据如何进行模糊查询?
在数据安全和隐私保护日益重要的今天,加密技术成为保护敏感数据的重要手段。然而,加密后的数据在存储和传输过程中虽然安全性得到了提升,但如何对这些数据进行高效查询,尤其是模糊查询,成为了一个挑战。本文将深入探讨如何在保证数据安全的前提下,实现加密数据的模糊查询功能。
1785 0
|
存储 资源调度 运维
【FusionCompute】介绍(一)
【FusionCompute】介绍(一)
1166 0
【FusionCompute】介绍(一)
|
11月前
|
Java 程序员 开发者
面试官最爱的面试题:wait() 和 notify() 为什么需要同步?
大家好,我是小米。今天来探讨一个常见的Java面试题:为什么线程通信的 `wait()`、`notify()` 和 `notifyAll()` 方法被定义在 Object 类里,且必须在同步方法或同步块中调用?通过小明和小红的工作场景,我们理解了这些方法的核心思想——线程间的协调与通信。它们依赖于对象锁,确保线程按预期顺序执行,避免资源争抢和死锁。掌握这些知识点,能帮助你更好地应对多线程相关的面试问题。如果你对线程同步等话题感兴趣,欢迎继续交流。
187 12
|
11月前
|
人工智能 API 开发者
阿里CEO吴泳铭-2024互联网大会发言:AI的最大价值是推动生产力变革
11月21日,2024年世界互联网大会“互联网企业家论坛”在乌镇召开。阿里巴巴CEO吴泳铭表示,AI的最大价值在于推动各行各业的生产力变革,而非仅限于开发超级APP。他强调,发展AI需建设繁荣的技术、产品和市场生态。目前,30多万家企业已接入阿里“通义”大模型,应用于代码开发、药物研发等场景。阿里巴巴坚持开源路线,全球开发者基于“通义千问”开发的衍生模型已突破7.8万个。吴泳铭认为,AI的发展需要行业共同努力,建设繁荣生态以实现高质量持续发展。
|
12月前
|
敏捷开发 监控 数据可视化
项目管理仪表盘详解:高效团队协作从这里开始
从IT开发到工程建设、从市场营销到研发项目,仪表盘都可以通过整合和可视化关键数据,帮助团队协作、监控进度、优化资源配置,从而确保项目按时、高质量交付。
563 0
项目管理仪表盘详解:高效团队协作从这里开始
|
Dart 监控 测试技术
在Flutter开发中,注重代码质量与重构实践显得尤为重要
【6月更文挑战第11天】随着Flutter在跨平台开发的普及,保持高质量代码成为开发者关注的重点。良好的代码质量关乎应用性能、稳定性和开发效率。为提升Flutter代码质量,开发者应遵循最佳实践,编写可读性高的代码,实施代码审查和自动化测试。重构实践在应对代码复杂性时也至关重要,包括识别重构时机、制定计划、逐步操作及利用重构工具。注重代码质量和重构是Flutter开发成功的关键。
257 3
|
关系型数据库 MySQL 数据库
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
|
Java 测试技术 Linux
docker使用openJDK导致Excel导出问题
docker使用openJDK导致Excel导出问题
1467 1
|
机器学习/深度学习 搜索推荐 算法
深度学习推荐模型-DeepFM
在DeepFM提出之前,已有LR,FM,FFM,FNN,PNN(以及三种变体:IPNN,OPNN,PNN*),Wide&Deep模型,这些模型在CTR或者是推荐系统中被广泛使用。
602 0
深度学习推荐模型-DeepFM
|
机器学习/深度学习 存储 PyTorch
基于Pytorch的图卷积网络GCN实例应用及详解3.0
基于Pytorch的图卷积网络GCN实例应用及详解3.0
883 0
基于Pytorch的图卷积网络GCN实例应用及详解3.0