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 即可;

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

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

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

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

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

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

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

  4. 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)

    [线上环境] Dubbo 线程池占满原因排查系列 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient) 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:C ...

  5. 使用maven的profile区分本地环境和线上环境

    使用maven的profile区分本地环境和线上环境 多环境开发,使用maven-profile,就可以在打包的时候通过参数的调整,最终打的包也不同. 以区分本地数据库和线上数据库为例 比如测试环境, ...

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

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

  7. node开发环境(mac)和线上环境(linux)搭建

    以前一直在做php后台,对node没有认真研究,现在前端发展速度这么快,再加上node的飞速发展,javascript统一中原指日可待啊.em~~,废话不多说开始开发环境和线上环境搭建吧,写一下自己的 ...

  8. 线上环境HBASE-1.2.0出现oldWALs无法自动回收情况;

    正常情况下,hmaster会定期清理oldWALs文件夹,一般该文件大小也就几百兆,但是我们线上 环境出现了该文件没有自动回收情况,如图: 该目录占用hdfs空间多达7.6T,浪费空间: 后来经过多番 ...

  9. 【原创】线上环境 SYN flooding 问题排查

    问题描述:        线上环境中,公司自研即时通讯软件不定时掉线. 问题排查:        由运维和测试人员发现并报告,线上环境出现网络异常,具体表现为登录服务器虚拟 IP 地址无法 ping ...

最新文章

  1. leetcode算法题--求1+2+…+n
  2. 进阶第四课 Python模块之os
  3. 教你怎么用WIN7系统自带工具调整硬盘分区
  4. 不装客户端连接mysql_C#不安装oracle客户端,如何连接到oracle数据库
  5. C语言基础:C语言宏定义(4) - 多文件编译
  6. Java 中类的静态成员与类的实例对象回收
  7. 大屏可视化分配率是什么意思_什么是分配率?
  8. mysql学习笔记(1-安装简介)
  9. 更改tomcat自带的logo
  10. java isequal_Java LocalDate isEqual()用法及代码示例
  11. 日程表|第8届高等学校计算机程序设计课程论坛
  12. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
  13. java 阿拉伯数字日期转换为中文大写日期方法_日期转换为中文大写数字
  14. 蛙蛙推荐:蛙蛙教你发明一种新语言之一--词法分析和语法分析
  15. 样本方差为何除以n-1而不是n?
  16. 南非NRCS认证简介
  17. 《娱乐至死》毁掉我们的,恰恰是我们所热爱的东西!
  18. 计算机电源不通电 维修,电脑忽然不通电,换了电源也不行,是哪里坏了?
  19. win10系统找不到telnet服务器,大神解答win10系统找不到Telnet服务的办法
  20. CouchDB使用小记

热门文章

  1. 星外php使用教程_星外PHP5.2.17自动配置一键安装包 防phpdos v1.4
  2. koa连接mysql怎么做_koa-连接mysql数据库
  3. STL删除元素注意事项
  4. python学习笔记之迭代器
  5. Spark记录-Scala语法基础
  6. Linux环境下手动配置sbt
  7. js ajax上传图片到服务器
  8. Linux管事器战略 Web站点的悄然八要素
  9. ref 与 out 参数的区别
  10. 15个月纪念,开心!