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 binlog
Jun 11 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
Mysql数据库手动及定时备份步骤
Nov 07 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
MySQL优化及索引解析
Mar 17 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
MySQL数据库查询之多表查询总结
Aug 05 MySQL
MySql按时,天,周,月进行数据统计
Aug 14 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 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 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
更正确的asp冒泡排序
2007/05/24 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
python使用分治法实现求解最大值的方法
2015/05/12 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
党支部三会一课计划
2014/09/24 职场文书
股权转让协议书
2014/12/07 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
教师岗位说明书
2015/09/30 职场文书
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS
php双向队列实例讲解
2021/11/17 PHP