备注:插图来自淘宝苏普的博客并保留水印,如果觉得不当还请及时告知 :)

写在前面:MySQL的query cache大部分情况下其实只是鸡肋而已,建议全面禁用。当然了,或许在你的场景下还是挺好的,还能发挥作用,那就继续使用吧,把本文当做参考就好。

不过,可能有的人人为只需要把 query_cache_size 大小调整为 0 就可以了,可以忽略 query_cache_type 参数的值,反正它也是可以在线调整的。

事实果真如此吗?让我们来实际模拟测试下就知道了。

我们模拟了以下几种场景:

1、初始化时,同时设置 query_cache_size 和 query_cache_type 的值为 0;2、初始化时,设置 query_cache_size = 0,但设置 query_cache_type = 1;3、初始化时,设置 query_cache_size = 0,query_cache_type = 1,但是启动后立刻 修改 query_cache_type = 04、初始化时,设置 query_cache_size = 0,query_cache_type = 0,但是启动后立刻 修改 query_cache_type = 15、初始化时,设置 query_cache_size = xMB,query_cache_type = 1,但是启动后立刻 修改 query_cache_type = 0

经过测试,可以得到下面几个重要结论(详细测试过程请见最后):

1、想要彻底关闭query cache,务必在一开始就设置 query_cache_type = 0,即便是启动后将 query_cache_type 从 1 改成 0,也不行;2、即便query_cache_size = 0,但 query_cache_type 非 0 的话,在实际环境中,可能会频繁发生 Waiting for query cache lock;3、一开始就设置 query_cache_type = 0 的话,没有办法在运行 过程中再次动态启用,反过来则可以。也就是说,一开始是启用 query cache 的, 在运行过程中将其关闭,但事实上仍然会发生  Waiting for query cache lock,并没有真正的关闭;

关于query cache的延伸阅读,请见:

1、我的前同事waterbin帅哥的悲惨经历: MySQL Troubleshoting:Waiting on query cache mutex

2、淘宝苏普的旧文:

Query Cache,看上去很美

详细测试过程:

一、测试方法

采用sysbench模拟并发oltp请求:

sysbench --test=tests/db/oltp.lua --oltp_tables_count=10 --oltp-table-size=100000 --rand-init=on --num-threads=64 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=1800 --max-requests=0 run

二、具体几种测试模式

1、一直关闭QC(query cache的简写,下同),即  query_cache_size = 0, query_cache_type = 0

测试过程中,一直都没有和query cache lock相关的状态出现,结果tps:2295.34

2、启用QC,但QC size 设置为 0,即:query_cache_size = 0,query_cache_type = 1

测试过程中,一直有 Waiting for query cache lock 状态出现,结果tps:2272.52

3、启用QC,但QC size为0,但启动时立刻关闭QC,即初始化时 query_cache_size = 0,query_cache_type = 1,启动后立刻修改 query_cache_type = 0

测试过程中,也一直有 Waiting for query cache lock 状态出现,结果tps:2311.54

4、关闭QC,但启动后立刻启用QC,即初始化时 query_cache_size = 0,query_cache_type = 0,启动后立刻修改 query_cache_type = 1

这时,会提示报错信息:

失败:ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it

也就是说,如果一开始就关闭 QC 的话,是没办法在运行过程中动态再启用QC的。

5、启用QC,并设置QC size为256M,即 query_cache_size = 256M,query_cache_type = 1

这种情况下,在测试过程中一直有 Waiting for query cache lock 状态出现,并且结果tps也很差,只有 1395.39(几个案例中最差的一种)

6、启用QC,设置QC size为256M,但启动后立刻关闭QC,即 query_cache_size = 256M,query_cache_type = 1,启动后立刻修改 query_cache_type = 0

这种情况下,在测试过程中也一直有  Waiting for query cache lock 状态出现,结果tps:2295.79(在这个模式下,如果设置 query_cache_type = 2,效果也不佳)

第三种模式下,虽然看起来tps还不错,但毕竟上面只是简单模拟测试,实际情况下如果有频繁的query cache lock的话,tps肯定不会太好看。

因此,总的来说,想要获得较高tps的话,最好还是一开始就关闭QC,不要心存侥幸或者固守陈规。

为什么要关闭 MySQL Query Cache?相关推荐

  1. mysql query cache 关闭_为什么要关闭MySQL query cache-Fun言

    MySQL的query cache大部分情况下其实只是鸡肋而已,建议全面禁用.当然了,或许在你的场景下还是挺好的,还能发挥作用,那就继续使用吧,把本文当做参考就好. 不过,可能有的人人为只需要把 qu ...

  2. mysql query cache

    1.概述: MySQL Query Cache 缓存客户端提交给MySQL的SELECT(注意只是select)语句以及该语句的结果集. 注意:query_cache是mysql server端的查询 ...

  3. mysql query cache 大小_MySQL查詢緩存:限制為128 MB的最大緩存大小?

    My application is very database intensive so I've tried really hard to make sure the application and ...

  4. mysql query cache 命中率_MySQL缓存命中率概述及如何提高缓存命中率

    MySQL缓存命中率概述 工作原理: 查询缓存的工作原理,基本上可以概括为: 缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句: 新的SELECT语句或预处理查询语句 ...

  5. mysql query cache优化

    query cache原理 当mysql接收到一条select类型的query时,mysql会对这条query进行hash计算而得到一个hash值,然后通过该hash值到query cache中去匹配 ...

  6. mysql query cache 查询缓存

    查看本博文,并进行验证(验证结果与博文一致): https://blog.csdn.net/carmazhao/article/details/7088530 mysql默认是开启查询缓存的. 设置查 ...

  7. mysql havequerycache_如何开启MySQL的中的Query Cache缓存

    MySQL Query Cache是mysql中的一个功能,主要是用来缓存和查询相关数据,本文文详细介绍如何开启MySQL中的Query Cache,以及Query Cache中的一些参数. MySQ ...

  8. gmap mysql cachet,MySQL的缓存(Query Cache)

    1.MySQL Query Cache query cache是MySQL数据库用于缓存select语句以及语句的结果集.该缓存在技术细节上类似键值对存储,将select语句和语句的查询结果集做了一个 ...

  9. mysql 禁用查询缓存 query cache

    os:centos 6.8 mysql: 5.5.49 MySQL Query Cache 会缓存select 查询,但是在调优sql查询及测试数据库的性能时需要禁用该功能. 查看变量.状态 mysq ...

最新文章

  1. 2022-2028年中国乙烷行业投资分析及前景预测报告
  2. 写文章 TEE技术分析【转】
  3. 聊聊Elasticsearch的ExponentiallyWeightedMovingAverage
  4. ITK:将BinaryMorphologicalClosingFilter应用于给定LabelMap的一个LabelObject
  5. centos解压zip命令_Linux日常运维(5)—常用压缩包解压命令整理
  6. 在Android中使用自带API操作Json
  7. Firefox配置更改导致B站视频加载失败(MEDIA SEGMENT下载错误)的某种情况
  8. Android广告图片轮播,支持无限循环和设置轮播样式、切换时间等
  9. BKEX Global研究院最新市场信息解读
  10. 钉钉邮箱登录入口_钉邮的使用攻略①
  11. 图像处理1--傅里叶变换(Fourier Transform )
  12. 暖通空调的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  13. Proxifier Socks5 代理(内网访问、远程办公)
  14. SpringMVC几个模型对象
  15. oracle addmonth用法,PLSQL ADD_MONTHS用法及代码示例
  16. 搜狗词库的批量下载#Python
  17. 计算机专业课好学吗,计算机专业课程有哪些 学计算机难不难
  18. 【leetcode-Python】-Dynamic Programming -122. Best Time to Buy and Sell Stock II
  19. HTML5移动端手机网站开发
  20. 通信传输与接入SDH传输网

热门文章

  1. DeepLearning.AI第一部分第四周:深层神经网络
  2. apt-get update碰到错误
  3. 将一个简单远程调用的方式例子改为异步调用 -- 2
  4. mysql查询语句,int类型加引号居然也能查
  5. String对象的intern()
  6. hdu 6851 Vacation(思维+贪心)
  7. 以POST方式下载文件
  8. hapRroxy 安装配置详解
  9. std::priority_queue
  10. Android邮件发送详解