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 = 0 和 query_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

===============================================================================

如果还有什么问题,欢迎加入我的QQ群(125572178、272675472)讨论。

===============================================================================

题图:周瑜

周瑜,字公瑾,汉末名将。洛阳令周异之子,堂祖父周景、堂叔周忠,都官至太尉。长壮有姿貌、精音律,江东有“曲有误,周郎顾”之语。周瑜少与孙策交好,21岁起随孙策奔赴战场平定江东,后孙策遇刺身亡,孙权继任,周瑜将兵赴丧,以中护军的身份与长史张昭共掌众事。建安十三年 (208年),周瑜率江东孙氏集团军队与刘备军队联合,赤壁之战大败曹军,由此奠定了三分天下的基础。建安十四年(209年),拜偏将军领南郡太守。建安十五年(公元210年)病逝于巴丘(今湖南岳阳),年仅36岁。

周瑜《三国演义》里被描述成了没气量的人,最后还被孔明给气死,但真实的周瑜事实上很出色,有文才又有武才,可谓文武双全,综合谋略方面可能确实不如孔明,但总的来说还是很不错的。没有他光有孔明的话,也绝无可能促成后来的赤壁之战,奠定了三分天下的基础。建议大家听听《易中天品三国》系列,说的还是比较中肯的。

MySQL在线环境,[MySQL FAQ]系列 — 线上环境到底要不要开启query cache相关推荐

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

    Query Cache(查询缓存,以下简称QC)存储SELECT语句及其产生的数据结果,特别适用于:频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变 ...

  2. mysql在线检测失败_一则线上MySql连接异常的排查过程

    Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题## 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过 ...

  3. 线上的java环境_Linux部署JavaWeb线上环境

    1.ssh免密码登录 ssh-keygen -t rsa -C "18201225281@163.com" cp id_rsa.pub vim ~/.ssh/authorized_ ...

  4. 生产环境和开发环境_环境部署:开发、测试和线上环境的区别

    点击蓝字 关注我们 软件开发环境(Software Development Environment,SDE)是指在基本硬件和宿主软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件 ...

  5. vue3 全局注册app.config.globalProperties, 如何处理getCurrentInstance 上下文线上环境报错

    vue3挂载全局属性和方法,使用app.config.globalProperties, 但是在组件中获取全局上下文的时候getCurrentInstance会在线上环境报错. 搜索了一遍,看了好多文 ...

  6. doctor mysql数据导入_线上环境mysql主从同步的搭建过程

    之前搭建过一套主从同步的mysql集群,但是是基于新数据库,而这次线上环境要升级成主从同步的集群,记录一下升级过程和中间遇到的各种问题. 由于是直接对线上数据库进行修改,因此要保证对线上环境造成尽量小 ...

  7. mysql线上教程_线上环境mysql主从同步的搭建过程

    之前搭建过一套主从同步的mysql集群,但是是基于新数据库,而这次线上环境要升级成主从同步的集群,记录一下升级过程和中间遇到的各种问题. 由于是直接对线上数据库进行修改,因此要保证对线上环境造成尽量小 ...

  8. java mysql死锁_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

  9. 面试官:线上环境 FGC 频繁,如何解决?

    前言 这个问题应该是 Java 面试中很经常被问到的一个题目,很多人害怕这个题目. 因为大部分人可能在工作中根本遇不到 FGC 频繁的问题,即使从网上背了点答案,心里也不踏实,因为毕竟不是自己亲自接触 ...

最新文章

  1. 50道练习实践学习Pandas!
  2. ThreadLocal究竟存不存在内存泄漏?
  3. uni-app运行编译报错
  4. python2.7安装matplotlib_Ubuntu-Python2.7安装 scipy,numpy,matplotlib 和pip
  5. CTF-汇编语言归纳
  6. 新浪安装weiphp2.0的方法
  7. Flutter进阶—质感设计之直接输入
  8. [转帖] 国产x86-海光禅定 2018年营收过亿?
  9. Paint方法总结(二):着色渲染器Shader
  10. 从小白到区块链工程师:第一阶段:Go语言的HelloWorld初始(2)
  11. 请说出三种减少页面加载时间的方法
  12. JS Range使用整理
  13. 《深入理解Java虚拟机:JVM高级特性与最佳实践》 (第3版)周志明 著
  14. java写的小米商城_开发”小米商城官网首页”(静态页面)
  15. Macbook查看隐藏文件
  16. 性能测试 性能测试实战(七)Jmeter分布式性能测试 influxDB Grafana Master Salve 主从配置 高并发性能测试 环境搭建 性能数据收集 性能数据可视化平台 搭建问题分析
  17. 分布式系统之-我的书单
  18. 用outook发邮件能撤回吗?邮件怎么撤回技巧
  19. 3D数学基础:正交矩阵
  20. C13:Unity3D制作智能家居设计软件——定制系统

热门文章

  1. Tamevic's Ctf-Web writeup@实验吧‘天下武功唯快不破’
  2. 大数据之路—— 数据整合和管理体系
  3. SCCB总线协议的详细讲解与程序实现
  4. 本周AI热点回顾:GPT-3开始探索付费使用;这个视频「橡皮擦」让你瞬间消失;英伟达最强消费级显卡RTX 3090出炉
  5. 单应性矩阵H和基础矩阵F
  6. XXTEA加密流程分析
  7. 前端学习之HTML——表格
  8. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境
  9. 混合颜色带(应用篇)
  10. Omnipeek 空口抓包之无线ping包详细讲解,超详细