MySQL高速缓存启动方法及参数详解(query_cache_size)


Posted in MySQL onJuly 01, 2021

MySQL query cache从4.1版本开始提供了,不过值今天本人才对其进行研究。默认配置下,MySQL的该功能是没有启动的,可能你通过show variables like ‘%query_cache%';会发现其变量have_query_cache的值是yes,MYSQL初学者很容易以为这个参数为YES就代表开启了查询缓存,实际上是不对的,该参数表示当前版本的MYSQL是否支持Query Cache,实际上是否开启查询缓存是看另外一个参数的值:query_cache_size ,该值为0,表示禁用query cache,而默认配置正是配置为0。

配置方法:

在MYSQL的配置文件my.ini或my.cnf中找到如下内容:

# Query cache is used to cache SELECT results and later return them
# without actual executing the same query once again. Having the query
# cache enabled may result in significant speed improvements, if your
# have a lot of identical queries and rarely changing tables. See the
# “Qcache_lowmem_prunes” status variable to check if the current value
# is high enough for your load.
# Note: In case your tables change very often or if your queries are
# textually different every time, the query cache may result in a
# slowdown instead of a performance improvement.

query_cache_size=0

以上信息是默认配置,其注释意思是说,MYSQL的查询缓存用于缓存select查询结果,并在下次接收到同样的查询请求时,不再执行实际查询处理而直接返回结果,有这样的查询缓存能提高查询的速度,使查询性能得到优化,前提条件是你有大量的相同或相似的查询,而很少改变表里的数据,否则没有必要使用此功能。可以通过Qcache_lowmem_prunes变量的值来检查是否当前的值满足你目前系统的负载。注意:如果你查询的表更新比较频繁,而且很少有相同的查询,最好不要使用查询缓存。

具体配置方法:

1.将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M。

2.增加一行:query_cache_type=1

query_cache_type参数用于控制缓存的类型,注意这个值不能随便设置,必须设置为数字,可选项目以及说明如下:

MySQL高速缓存启动方法及参数详解(query_cache_size)

如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。但是这种情况下query_cache_size设置的大小系统是否要为其分配呢,这个问题有待于测试?

如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。

如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。

OK,配置完后的部分文件如下:

query_cache_size=128M
query_cache_type=1

保存文件,重新启动MYSQL服务,然后通过如下查询来验证是否真正开启了:

 

复制代码 代码如下:

mysql> show variables like ‘%query_cache%';
+——————————+———?+
| Variable_name                | Value     |
+——————————+———?+
| have_query_cache             | YES       |
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 134217728 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+——————————+———?+
6 rows in set (0.00 sec)

主要看query_cache_size和query_cache_type的值是否跟我们设的一致:

这里query_cache_size的值是134217728,我们设置的是128M,实际是一样的,只是单位不同,可以自己换算下:134217728 = 128*1024*1024。

query_cache_type设置为1,显示为ON,这个前面已经说过了。

总之,看到上边的显示表示设置正确,但是在实际的查询中是否能够缓存查询,还需要手动测试下,我们可以通过show status like ‘%Qcache%';语句来测试,现在我们开启了查询缓存功能,在执行查询前,我们先看看相关参数的值:

 

复制代码 代码如下:

mysql> show status like ‘%Qcache%';
+————————-+———?+
| Variable_name           | Value     |
+————————-+———?+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134208800 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 0         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 2         |
| Qcache_queries_in_cache | 0         |
| Qcache_total_blocks     | 1         |
+————————-+———?+
8 rows in set (0.00 sec)

这里顺便解释下这个几个参数的作用:
Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。
Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。
Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。
Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。
Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量。
Qcache_queries_in_cache:当前缓存中缓存的查询数量。
Qcache_total_blocks:当前缓存的block数量。

下边我们测试下:

比如执行如下查询语句

 

复制代码 代码如下:

mysql> select * from user where id = 2;
+—-+——-+
| id | name  |
+—-+——-+
|  2 | test2 |
+—-+——-+
1 row in set (0.02 sec)

然后执行show status like ‘%Qcache%',看看有什么变化:

 

复制代码 代码如下:

mysql> show status like ‘%Qcache%';
+————————-+———?+
| Variable_name           | Value     |
+————————-+———?+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134207264 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 3         |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+————————-+———?+
8 rows in set (0.00 sec)

对比前面的参数值,我们发现Qcache_inserts变化了。Qcache_hits没有变,下边我们在执行同样的查询
select * from user where id = 2,按照前面的理论分析:Qcache_hits应该等于1,而Qcache_inserts应该值不变(其他参数的值变化暂时不关注,读者可以自行测试),再次执行:

show status like ‘%Qcache%',看看有什么变化:

 

复制代码 代码如下:

mysql> show status like ‘%Qcache%';
+————————-+———?+
| Variable_name           | Value     |
+————————-+———?+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134207264 |
| Qcache_hits             | 1         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 4         |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+————————-+———?+
8 rows in set (0.00 sec)

OK,果然跟我们分析的完全一致。

MySQL 相关文章推荐
MySQL的join buffer原理
Apr 29 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL删除和插入数据很慢的问题解决
Jun 03 MySQL
MySQL分库分表详情
Sep 25 MySQL
mysql函数全面总结
Nov 11 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL 语句执行顺序举例解析
Jun 05 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 #MySQL
MySQL中存储时间的最佳实践指南
Jul 01 #MySQL
MySQL连表查询分组去重的实现示例
Jul 01 #MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 #MySQL
解决Mysql的left join无效及使用的注意事项说明
mysql left join快速转inner join的过程
MySQL 十大常用字符串函数详解
You might like
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP安全下载文件的方法
2016/04/07 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
PHP fclose函数用法总结
2019/02/15 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
vue实现搜索功能
2019/05/28 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
创联软件面试题笔试题
2012/10/07 面试题
Ruby如何创建一个线程
2013/03/10 面试题
党员创先争优公开承诺书
2014/03/28 职场文书
爱之链教学反思
2014/04/30 职场文书
大学生优秀班干部事迹材料
2014/05/26 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android