MySQL的QueryCache图文详解Mysql

QueryCache的工作原则是:执行查询最快的方式就是不去执行。QueryCache的组件图和流程图如下所示:

QueryCache的主要可配置系统变量如下所示:

表示mysqld是否支持QueryCache。

表示QueryCache可以缓存的单条查询的最大结果集的大小,默认值为1MB。如果某次查询的结果集大小超过这个系统变量的值,那么QueryCache就不会缓存这次查询的结果集。

表示MySQL为QueryCache每次分配内存的最小空间大小,也就是用于缓存查询结果的最小内存空间的大小,默认值为4KB。

表示QueryCache可以使用的最大内存空间的大小,默认值为1MB。设置的值必须是1024的整数倍,若不是整数倍,MySQL则会自动调整降低至达到1024倍数的最大值。

表示QueryCache的工作模式,同时也是QueryCache功能的开关,可以设置为0(OFF)、1(ON)和2(DEMAND)三种值:

以上环境变量经常需要调整的是query_cache_limit和query_cache_min_res_unit,它们都需要根据实际业务进行相应的调整。例如,如果缓存的查询结果集大多数都小于4KB的话,则可以适当的调整query_cache_min_res_unit的值,以避免造成内存的浪费。如果查询结果集的大小又都大于1MB时,就需要调整query_cache_limit的值,避免因为结果集大小超过限制而不被缓存。

MySQL提供一系列的状态变量来记录QueryCache的当前状态,使你能够确认QueryCache的运行是否健康、命中率如何、内存空间大小是否足够,等等。QueryCache的状态变量如下所示:

表示QueryCache中目前还有多少空闲的内存块。如果该值比较大,则说明QueryCache中的内存碎片可能比较多。FLUSHQUERYCACHE会对缓存中的碎片进行整理,从而得到一个较大的空闲内存块。

表示QueryCache目前空闲的内存大小。

表示有多少次查询在QueryCache命中。

向QueryCache中插入新记录的次数,也就是查询没有命中的次数。

表示由于QueryCache的内存不足而从缓存中删除的查询结果的数量。如果这个数值在不断增长,那么一般是QueryCache的空闲内存不足(通过Qcache_free_memory判断),或者内存碎片较严重(通过Qcache_free_blocks判断)。

表示没有被缓存的查询数量。有三种情况会导致查询结果不会被缓存:其一,由于query_cache_type的设置;其二,查询不是SELECT语句;其三,使用了now()之类的函数,导致查询语句一直在变化。

表示QueryCache中当前包含的查询结果数量。

表示QueryCache中的内存块总数量。

QueryCache的查询,发生在MySQL接收到客户端的查询请求、查询权限验证之后和查询SQL解析之前。也就是说,当MySQL接收到客户端的查询SQL之后,仅仅只需要对其进行相应的权限验证之后,就会通过QueryCache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互。由于QueryCache是基于内存的,直接从内存中返回相应的查询结果,因此减少了大量的磁盘I/O和CPU计算,导致效率非常高。

即使QueryCache的优点很明显,但是也不能忽略它所带来的一些缺点:

实际上,并不是所有表都适合使用QueryCache。造成QueryCache失效的原因主要是相应的表发生了变更,那么就应该避免在变更频繁的表上使用QueryCache。MySQL针对QueryCache有两个专用的SQL选项:SQL_NO_CACHE和SQL_CACHE。若将query_cache_type设置为1(ON),那么通过SQL_NO_CACHE选项便能强制不使用QueryCache;若将query_cache_type设置为2(DEMAND),那么通过SQL_CACHE选项便能强制使用QueryCache。通过强制不使用QueryCache,可以让MySQL在频繁变更的表上不使用QueryCache,这样减少了内存开销,也减少了hash计算和查找的开销。

无论MySQL收到的查询语句是单表还是多表或是包含子查询的SQL,都被作为一个查询,不会被分拆成多个查询来进行缓存,包括Union语句。

有影响。由于QueryCache在内存中是以hash结构来进行映射的,hash算法的基础就是组成查询语句的字符,所以必须要整个查询语句在字符级别完全一致,才能在QueryCache中命中。

为了保证QueryCache中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增、修改、删除等,都会使所有引用到该表的QueryCache缓存数据失效。

QueryCache碎片率=Qcache_free_blocks/Qcache_total_blocks*100%如果QueryCache碎片率超过20%,则可以用FLUSHQUERYCACHE整理内存碎片;如果你的查询都是小数据量的话,可以尝试减小query_cache_min_res_unit。

QueryCache利用率=(query_cache_size-Qcache_free_memory)/query_cache_size*100%

QueryCache利用率在25%以下的话,说明query_cache_size设置的过大,可适当减小;QueryCache利用率在80%以上,而且Qcache_lowmem_prunes>50的话,说明query_cache_size可能有点小,或者就是内存碎片太多。

①可缓存查询的QueryCache命中率=Qcache_hits/(Qcache_hits+Qcache_inserts)*100%②涵盖所有查询的QueryCache命中率=Qcache_hits/(Qcache_hits+Com_select)*100%

若命中率在50-70%的范围之内,则表明QueryCache的缓存效率较高。如果命中率明显小于50%,那么建议禁用(将query_cache_type设置为0(OFF))或按需使用(将query_cache_type设置为2(DEMAND))QueryCache,节省的内存可以用作InnoDB的缓冲池。

如果Qcache_lowmem_prunes值比较大,表示QueryCache的内存空间大小设置太小,需要增大。

如果Qcache_free_blocks值比较大,表示内存碎片较多,需要使用FLUSHQUERYCACHE语句清理内存碎片。

query_cache_min_res_unit的计算公式如下所示:

query_cache_min_res_unit=(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache

其中,一般不建议将QueryCache的大小(也就是query_cache_size系统变量)设置超过256MB。

MySQL的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询操作才能命中缓存,因此MySQL的查询缓存命中率很低,另一方面,对于大结果集的查询,其查询结果可以从cache中直接读取,有效的提升了查询效率。

那么如何设置缓存的大小呢?来看一下:

1、在mysql客户端命令行中我们可以这么查看缓存是否开启以及缓存设置的大小:

mysql>showvariableslike'%query_cache%';+------------------------------+-------------+|Variable_name|Value|+------------------------------+-------------+|have_query_cache|YES||query_cache_limit|1048576||query_cache_min_res_unit|4096||query_cache_size|16106127360||query_cache_type|ON||query_cache_wlock_invalidate|OFF|+------------------------------+-------------+6rowsinset(0.01sec)其中:

query_cache_type:是否开启缓存功能,取值为ON,OFF,DEMAND,默认值为ON-值为OFF或0时,查询缓存功能关闭;-值为ON或1时,查询缓存功能打开,SELECT的结果符合缓存条件即会缓存,否则,不予缓存,显式指定SQL_NO_CACHE,不予缓存;-值为DEMAND或2时,查询缓存功能按需进行,显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存

query_cache_wlock_invalidate:表示当有其他客户端正在对MyISAM表进行写操作时,如果查询在querycache中,是否返回cache结果还是等写操作完成再读表获取结果。

query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M;

query_cache_min_res_unit为系统分配的最小缓存块大小,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费;query_cache_size:表示缓存的大小。

了解了以上的指标后我们就可以在mysql的配置文件my.cnf中进行设置。然后重启mysl服务器即可。在[mysqld]下面添加参数。一般是设置query_cache_size和query_cache_type两项。

2、上面查看的是我们进行缓存的配置,它一般从配置文件中读取值,但是有时候我们需要实时查看当前mysql中的数据缓存大小。

mysql>showstatuslike'%qcache%';+-------------------------+----------+|Variable_name|Value|+-------------------------+----------+|Qcache_free_blocks|1||Qcache_free_memory|1031832||Qcache_hits|0||Qcache_inserts|0||Qcache_lowmem_prunes|0||Qcache_not_cached|16489053||Qcache_queries_in_cache|0||Qcache_total_blocks|1|+-------------------------+----------+8rowsinset(0.00sec)解释:

Qcache_free_memory:缓存中的空闲内存。

Qcache_total_blocks:缓存中块的数量。

3、清空缓存:

flushquerycache命令

加大缓存有助于我们查询的效率提高:

这里举个例子:

mysql>usemob_adnDatabasechangedmysql>selectcount(*)fromcreative_output;+----------+|count(*)|+----------+|87151154|+----------+1rowinset(3min18.29sec)mysql>selectcount(*)fromcreative_output;+----------+|count(*)|+----------+|87151154|+----------+1rowinset(0.00sec)mysql>selectcount(*)fromcreative_output;+----------+|count(*)|+----------+|87151154|+----------+1rowinset(0.00sec)可以看到缓存真的很厉害。

还有的同学会想到innodb_buffer_pool这个参数,两者的作用与区别我会接着来讲。

THE END
1.5.1判断的概述课件20245.1 判断的概述第五课 正确运用判断一、判断及其基本特征二、判断的表达与类型预习提纲一、判断及其基本特征1、使用判断的原因2、什么是判断?3、判断的基本特征是什么?4、什么是真判断?什么是假判断?二、判断的表达与类型1、判断的表达形式(判断与语句的关系)2、判断的类型有哪些?【课标要求】【核心素养】【教学https://m.zxxk.com/soft/48987320.html
2.判断选择语句执行。因此条件判断表达式只能是关系运switch语句 条件的表示 ·关系运算 关系运算符实现两个操作数的大小比较,关系运算符也称比较运算符。用关系运算符将两个操作数连接起来的式子叫关系表达式。 关系表达式的结果: 关系成立,运算结果为“1”,具有逻辑值“真”。 关系不成立,运算结果为“0”,具有逻辑值“假”。 https://blog.csdn.net/ky_lie/article/details/131229168
3.第三章判断(一)三、判断与语句的关系 1.联系: 判断是语句的思想内容,语句是判断的语言表现形式。任何判断都要用语句来表达。 2.区别: (1)判断作为思维形式,是精神形态的东西;而语句作为语言形式是物质形态的东西。 (2)不是所有语句都表达判断。 A、一般而言,判断用陈述句(或叫断定句)来表达。 http://www.360doc.com/content/10/0529/23/1146003_30236164.shtml
4.2020选调生高分答题技巧河南选调生技巧常识判断速记要点 言语理解与表达 第一节 高频考点 1.阅读理解中重点掌握五种关联词和五种行文脉络的标志和用法,务必做到背得住、认得出、用得准。并注意在分析文段时,关联词须和行文脉络结合使用。 2.逻辑填空题量通常占据整个言语的50%,难度又是行测中烧脑之最。掌握词语辨析方法,准确把握语境中照应信息的提示https://ha.huatu.com/zt/2020xdsqf
5.专题10推理篇——判断与推理(讲义)1.判断的表达 (1)判断是通过语句表达的。判断是语句的思想内容,语句是判断的语言形式。 (2)判断与语句之间的关系是思维与语言之间关系的具体表现。与判断这种思维形式相对应的语言形式是语句,任何判断都必须用语句表达。 (3)判断与语句不完全对应,具体表现为以下三个方面:第一,有些语句表达判断,有些语句不表达判https://zujuan.xkw.com/thematiclist/16pt4354ct12965n370202.html
6.高考试题整理(正确理解现代汉语)①中美关系 动荡,不符合双方的根本利益. ②你比他只是 差一点,其实两人不相上下. ③这几天我 接到一些莫名其妙的电子邮件. a.一再 多少 往往 b.再三 多少 常常 c.一再 稍微 常常 d.再三 稍微 往往 4,(2003年全国高考试卷) 下列词语中加点的字的读音完全相同的一项是( ) https://www.diyifanwen.com/kaoshizhuanti/zhuangyuanfengcai/0761603292859090_454.htm
7.c语言程序设计知识点4、if语句的嵌套及if与else的配对关系(P99)略 5、条件运算符及其优先级和结合性及其求值过程(P102-104)例子:max=(a》b)?a:b;“(a》b)?a:b”是一个条件表达式,如果(a》b)为真,则条件表达式取值a;否则取值b。条件运算符优先级别低于关系运算符和算术运算符。故上式中括号可以省略条件运算符的结合方向为https://www.jianshu.com/p/d36002b8e9d7
8.赣州职业技术学院2022年单招考试大纲及样卷10、理解常见文言文的句式及其用法(包括判断句、倒装句、被动句、省略句)。 11、默写基本篇目名句名篇。 (二)基本技能 1、理解词语在文中的含义,把握文中重要的句子。 2、分析归纳文章的内容要点,理解作者的思路,辨别和筛选文中的重要信息。 3、分析文章的结构层次和表达方式。 http://www.gzpt.edu.cn/info/1005/3459.htm
9.CadenceSKILL语言学习历程全记录除此之外类型还有很多数据判断和数据类型判断函数,这也是经常用到的,采用这些函数有时候极大的简化了代码,同样避免使用过多的关系运算符和if语句。具体看下表: 2.5.4 控制语句 同c语言类似,Skill语言同样有各种判断和循环控制语句,下面分别举例说明一下。 https://picture.iczhiku.com/weixin/message1572934012440.html
10.事业编《综合基础知识》题库(16)A.市场上的供求关系定价 B.成本加成法 C.单一定价与歧视定价相结合的策略定价 D.价格领先制 13、 唯物主义一元论同唯心主义一元论对立的根本点在于: A.世界发展动力问题 B.意识本质问题 C.世界本原问题 D.实践本质问题 14、 公文可以转变为值得信赖的历史档案,或者成为可资采信的: http://www.sdsgwy.com/article/html/700120_16.html
11.议论文的写作教案6篇(全文)写议论文必须注意逻辑性,段落与段落之间要有非常清楚的逻辑关系,一方面要依靠语句表达出逻辑性,另一方面要借助起过渡性作用的语句突出逻辑关系。 一个语段的内部之间也需要有严谨的逻辑关系。 严密的逻辑关系必须反映出作者的行文思路。 注意议论文中的“但”“但是”等转折连词的作用,俗语有“‘但’字后面有文章”https://www.99xueshu.com/w/fileje1o3ypu.html
12.形式逻辑试题(精选6篇)29.“能被2整除的数”与“能被3整除的数”,这两个概念外延间的关系是——交叉关系 30下列概括错误的是——不正确的思想——错误 31.“法是阶级意志的表现”这一定义犯了——定义过宽错误 32.判断和语句的关系是——同一个语句可以表达不同的判断 https://www.360wenmi.com/f/filewe6e6xbk.html