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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: [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 Java
Flink自定义Connector
Flink自定义Connector
932 0
|
网络协议 安全 网络安全
【UDP】——为什么 UDP 数据包不能超过 512 个字节
一开始了解的是 DNS 服务使用的是 UDP 协议,后面看到 DNS 服务主要使用 UDP 协议,在少数情况(传输的数据超过 512 个字节)下也会使用 TCP 协议,因为 UDP 数据包不能超过 512 个字节。那问题来了,为什么 UDP 数据包不能超过 512 个字节呢?
4658 0
【UDP】——为什么 UDP 数据包不能超过 512 个字节
|
3月前
|
JSON 安全 生物认证
WhatWeb-网站安全扫描指纹识别
WhatWeb 是一款网站指纹识别工具,用于快速识别目标网站的 Web 服务器类型、CMS、脚本语言、中间件及可能存在的漏洞信息,常用于渗透测试与安全审计。
255 1
|
3月前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
11月前
|
人工智能 自然语言处理 并行计算
Kokoro-TTS:超轻量级文本转语音模型,支持生成多种语言和多种语音风格
Kokoro-TTS 是一款轻量级文本转语音模型,支持多语言和多语音风格生成,具备实时处理能力和低资源占用,适用于多种应用场景。
1850 5
Kokoro-TTS:超轻量级文本转语音模型,支持生成多种语言和多种语音风格
|
Linux
【Linux命令200例】diff比较两个文件的差异
diff命令是Linux系统中的一个非常实用且常用的命令。它用于比较两个文件的差异,并输出不同之处的详细说明。diff命令可以帮助我们快速找出两个文件之间的差异,从而方便我们进行文件对比、合并和版本控制等操作。
1403 0
|
Java 编译器 测试技术
全面理解Maven Compiler Plugin-Maven编译插件
【10月更文挑战第16天】
3211 1
|
存储 安全 Linux
操作系统(13)-----文件管理4
操作系统(13)-----文件管理
455 0
|
Web App开发 应用服务中间件 Apache
Get/POST方法提交的长度限制
 1.    Get方法长度限制 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。 如:IE对URL长度的限制是2083字节(2K+35)。 下面就是对各种浏览器和服务器的最大处理能力做一些说明. Microsoft Internet Explorer (Browser) IE浏览器对URL的最大限制
11726 2
|
人工智能 图形学 Python
分享40个Python游戏源代码总有一个是你想要的
分享40个Python游戏源代码总有一个是你想要的
2068 0