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文件存储图文详解
Jun 01 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
mysql 获取时间方式
Mar 20 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
优化Mysql查询的示例
Apr 26 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
Mysql中mvcc各场景理解应用
Aug 05 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临时文件的安全性分析
2014/07/04 PHP
PHP常用处理静态操作类
2015/04/03 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP概率计算函数汇总
2015/09/13 PHP
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
用pickle存储Python的原生对象方法
2017/04/28 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
python中shell执行知识点
2020/05/06 Python
同程旅游英文网站:LY.com
2018/11/13 全球购物
城建学院毕业生自荐信
2014/01/31 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
应届毕业生自荐信
2014/05/28 职场文书
支部鉴定材料
2014/06/02 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
辩护意见书
2015/06/04 职场文书
python实现自动化群控的步骤
2021/04/11 Python
windows安装python超详细图文教程
2021/05/21 Python
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python