文档章节

MySQL query cache优化

 朽木Sweayer
发布于 2017/08/16 09:22
字数 1406
阅读 7
收藏 1

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

query cache原理

MySQL接收到一条select类型的query时,mysql会对这条query进行hash计算而得到一个hash值,然后通过该hash值到query cache中去匹配,如果没有匹配中,则将这个hash值存放在一个hash链表中,同时将query的结果集存放进cache中,存放hash值的链表的每一个hash节点存放了相应query结果集在cache中的地址,以及该query所涉及到的一些table的相关信息;如果通过hash值匹配到了一样的query,则直接将cache中相应的query结果集返回给客户端。如果mysql任何一个表中的任何一条数据发生了变化,便会通知query cache需要与该table相关的query的cache全部失效,并释放占用的内存地址。

query cache优缺点

优点很明显,对于一些频繁select query,mysql直接从cache中返回相应的结果集,而不用再从表table中取出,减少了IO开销。

即使query cache的收益很明显,但是也不能忽略它所带来的一些缺点:

1. query语句的hash计算和hash查找带来的资源消耗。mysql会对每条接收到的select类型的query进行hash计算然后查找该query的cache是否存在,虽然hash计算和查找的效率已经足够高了,一条query所带来的消耗可以忽略,但一旦涉及到高并发,有成千上万条query时,hash计算和查找所带来的开销就的重视了;

2. query cache的失效问题。如果表变更比较频繁,则会造成query cache的失效率非常高。表变更不仅仅指表中的数据发生变化,还包括结构或者索引的任何变化;

3.对于不同sql但同一结果集的query都会被缓存,这样便会造成内存资源的过渡消耗。sql的字符大小写、空格或者注释的不同,缓存都是认为是不同的sql(因为他们的hash值会不同);

4. 相关参数设置不合理会造成大量内存碎片,相关的参数设置会稍后介绍。

合理利用query cache

query cache有利有弊,合理的使用query cache可以使其发挥优势,并且有效的避开其劣势。

1. 并不是所有表都适合使用query cache。造成query cache失效的原因主要是相应的table发生了变更,那么就应该避免在变化频繁的table上使用query cache。mysql中针对query cache有两个专用的sql hint:SQL_NO_CACHE和SQL_CACHE,分别表示强制不使用和强制使用query cache,通过强制不使用query cache,可以让mysql在频繁变化的表上不使用query cache,这样减少了内存开销,也减少了hash计算和查找的开销;

2. 设置合理的参数变量和状态变量。

首先查看query cache的系统变量。

  • have_query_cache 表示是否支持query cache;
  • query_cache_limit 表示query cache存放的单条query最大结果集,默认值为1M,结果集大小超过该值的query不会被cache;
  • query_cache_min_res_unit 表示query cache 每个结果集存放的最小内存大小,默认4k;
  • query_cache_size 表示系统中用于query cache的内存大小;
  • query_cache_type 系统是否打开了query cache功能;
  • query_cache_wlock_invalidate 针对myisam存储引擎,设置当有write lock在某个table上面的时候,读请求是要等待write lock释放资源之后再查询还是允许直接从query cache中读取结果,默认是OFF,可以直接从query cache中取得结果。

以上参数经常需要调整的是“query_cache_limit”和“query_cache_min_res_unit”,都需要根据业务做一些调整,比如cache的结果集大都小于4k的话,可以适当的调整"query_cache_min_res_unit"的值,以避免造成内存的浪费。如果结果集的大小又都大于1M时,就得调整"query_cache_limit"的值,避免因为结果集大小超过限制而不被mysql cache住。

查看query cache相关的状态变量

  • Qcache_free_blocks 表示query cache中目前还有多杀剩余的blocks,如果该值显示较大,则说明query cache中的内存碎片较多,需要进行整理了;
  • Qcache_free_memory 表示query cache目前剩余的内存大小;
  • Qcache_hits 表示query cache有多少次命中;
  • Qcache_inserts 表示未命中cache后将结果集再写入到cache中的次数;
  • Qcache_lowmem_prunes 表示多少条query因为内存不足而被清除出query_cache;
  • Qcache_not_cached 表示因为query_cache_type的设置或者不能被cache的query的数量;
  • Qcache_queries_in_cache 表示当前cache的query的数量;
  • Qcache_total_blocks 当前query cache中的block数量。

通过上述这些状态变量可以了解到query cache的运行状况,从而可以调整相应的系统参数的值。

query cache的限制

1. 5.1.17之前的版本不能cache绑定变量的query,但是从5.1.17版本开始,query cache已经开始支持绑定变量的query了;

2. 所有子查询中的外部查询sql不能被cache,只会cache最终的结果集;

3. 在procedure,function以及trigger中的query不能被cache;

4. 包含其他很多每次执行可能得到不一样结果的函数的query不能被cache。

鉴于上面的这些限制,在使用Query Cache 的过程中,建议通过精确设置的方式来使用,仅仅让合适的表的数据可以进入Query Cache,仅仅让某些Query 的查询结果被Cache。

粉丝 4
博文 5
码字总数 857
作品 0
苏州
数据库管理员
私信 提问
加载中
请先登录后再评论。
MySQL 语句执行过程详解

MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 MySQL InnoDB 锁 MySQL InnoDB MVCC MySQL Inno...

osc_r1i0f044
2019/11/11
0
0
MySQL数据库性能优化之一(缓存参数优化)

数据库属于 IO密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级...

爱mili
2016/01/04
72
0
MySQL高负载优化

MySQL配置文件优化 [client] port = 3306#客户端端口号为3306 socket = /data/3306/mysql.sock # default-character-set = utf8 #客户端字符集,(控制charactersetclient、charactersetconne......

osc_dnid8j42
2019/10/09
1
0
MySQL

慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句。例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查...

士兵7
2019/01/17
22
0
MySql数据库缓存

对MySql查询缓存及SQL Server过程缓存的理解及总结 一、MySql的Query Cache 1、Query Cache MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集。MySql在实现Query Cache...

osc_vl3n35s2
04/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

那些你可能不知道的免费观看 VIP 视频奇技淫巧

这是奇技淫巧系列第 7 篇文章,有兴趣点下面链接看之前的文章。 那些你可能不知道的浏览器奇技淫巧 那些你可能不知道的微信奇技淫巧 那些你可能不知道的微博奇技淫巧 那些你可能不知道的网易...

苏生不惑
2019/06/19
0
0
新零售和规模化定制时代

规模化生产和定制化生产 规模化生产和定制化生产是2种存在已久的生产模式,这2种生产各自有自己的优缺点,也各自有自己的客户群体。 拿服装行业来讲,中国过去30年行业的高速发展,正是受益于...

黄允聪
2019/05/25
0
0
如何利用 Spring Hibernate 高级特性设计实现一个权限系统

我们的业务系统使用了一段时间后,用户的角色类型越来越多,这时候不同类型的用户可以使用不同功能,看见不同数据的需求就变得越来越迫切。 如何设计一个可扩展,且易于接入的权限系统.就显得...

xilidou
2019/05/13
0
0
【转载】古典浏览器缓存和Service Worker对比

1. 传统的HTTP浏览器缓存策略 在一个网页的生命周期中,开发者为了缩短用户打开页面的时间,通常会设置很多缓存。其中包括了: 浏览器缓存 代理服务器缓存(CDN缓存) 服务器缓存 数据库缓存...

失败人士
01/16
0
0
AI_第一部分 数据结构与算法(3.时间与空间复杂度指标)

第四阶段我们进行深度学习(AI),本部分(第一部分)主要是对底层的数据结构与算法部分进行详尽的讲解,通过本部分的学习主要达到以下两方面的效果: 1.对开发中常见的算法能应用自如,让你在...

haishiniu
2018/11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部