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 相关文章推荐
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
MySQL的join buffer原理
Apr 29 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
52条SQL语句教你性能优化
May 25 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
mysql 数据插入优化方法之concurrent_insert
Jul 01 MySQL
MySQL空间数据存储及函数
Sep 25 MySQL
分享MySQL常用 内核 Debug 几种常见方法
Mar 17 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
mysql 排序失效
May 20 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 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
php简单统计字符串单词数量的方法
2015/06/19 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
JS实现随机数生成算法示例代码
2013/08/08 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
一步步教你用Python实现2048小游戏
2017/01/19 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
python爬取微信公众号文章
2018/08/31 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Python分类测试代码实例汇总
2020/07/23 Python
Python os库常用操作代码汇总
2020/11/03 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
职业生涯规划怎么写
2013/12/29 职场文书
高一地理教学反思
2014/01/18 职场文书
安全责任协议书
2014/04/21 职场文书
质量负责人任命书
2014/06/06 职场文书
花坛标语大全
2014/06/30 职场文书
客户答谢会致辞
2015/01/20 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
工作报告范文
2019/06/20 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记