当前位置:首页 > SQL > 正文内容

mysql查询缓存

高老师7年前 (2019-07-08)SQL2408

【一】.概念

查询缓存,就是将查询结果缓存起来,如果遇到相同的Sql查询,直接从缓存中读取结果。例如在一个商城中的商品分类是不会经常变动的,完全可以走缓存,没必要每次从磁盘中读取。

【二】.查询缓存开启状态

执行Sql:

show VARIABLES  like  '%query_cache%'

输出结果:

have_query_cache	YES
query_cache_limit	1048576
query_cache_min_res_unit	4096
query_cache_size	1048576
query_cache_type	OFF
query_cache_wlock_invalidate	OFF

输出解释:

have_query_cache  当前数据库是否支持缓存
query_cache_limit  单个查询能够使用的缓冲区
query_cache_min_res_unit 表示缓存存储于内存的最小单元,默认为4k,也就是说,即使查询结果只有1k,也会占用4k内存;所以,如果此值设置的过大,会造成内存空间的浪费,如果此值设置的过小,则会频繁的分配内存单元或者频繁的回收内存单元。
query_cache_size  表示查询缓存的总大小,也就是说,内存中用于查询缓存的空间大小,如果其值为0,即使开启了查询缓存,也无法缓存
query_cache_type 其值为ON、OFF、DEMAND,分别表示已启用、已禁用、按需缓存
query_cache_wlock_invalidate  表示查询语句所查询的表如果被写锁锁定,是否仍然使用缓存返回结果。OFF表示可以从缓存返回结果,ON表示等待写锁释放取出最新数据

【三】.开启缓存

上面的配置项query_cache_type为OFF状态表示未开启查询缓存,需要在mysql配置文件开启。注意是在[mysqld]后面设置query_cache_type = ON

【四】.Sql语句大小写影响缓存命中

select * from shop_category;

SELECT * FROM shop_category;

对于缓存来讲上面的2条Sql是不同的sql查询,虽然结果一样,假如第一条sql存在缓存,第二条语句依然不走缓存。因为mysql对比是否相同是使用sql语句的hash来对比的

【五】.灵活使用缓存

当query_cache_type = ON 时候, 我们也可以禁止部分SQL使用缓存:

select SQL_NO_CACHE name from shop_category;

当query_cache_type = DEMAND 时候, 我们也可以设置SQL使用缓存,没有设置全部不缓存

select SQL_CACHE name from shop_category;

【六】.缓存命中的查看

执行Sql:

show  status  like '%Qcache%';

输出结果:

Qcache_free_blocks	1
Qcache_free_memory	1029312
Qcache_hits	2
Qcache_inserts	2
Qcache_lowmem_prunes	0
Qcache_not_cached	4
Qcache_queries_in_cache	2
Qcache_total_blocks	6

输出解释:

Qcache_free_blocks 表示已分配的内存块中空闲块的数量
Qcache_free_memory 表示查询缓存的空闲总量大小
Qcache_hits  表示已经被缓存的Sql的命中次数
Qcache_inserts 表示在未命中缓存时,将查询结果写入缓存的次数
Qcache_lowmem_prunes 表示用于查询缓存的内存区域的修剪次数,修剪?修剪就是当用于缓存的内存被沾满时,mysql会使用LRU算法清除命中率低的缓存项,从而空余出部分内存空间。此值的数量越大,证明我们分配的内存小了,有必要跳转query_cache_size的值
Qcache_not_cached 表示没有被缓存的查询语句的数量
Qcache_queries_in_cache 表示已经缓存的SQL语句的数量
Qcache_total_blocks 表示当前查询缓存占用的内存的block数量

【七】.公式计算

查询缓存的碎片率 =(Qcache_free_blocks / Qcache_total_blocks)* 100%

查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%

查询缓存命中率 = (Qcache_hits / Com_select)* 100%    (Com_select=show status like "Com_select%")

如果碎片率太高,证明我们缓存内存碎片略多,可以尝试适当的调小query_cache_min_res_unit的值,也可以使用FLUSH QUERY CACHE语句来清理缓存碎片。

如果查询缓存利用率太低,则表示query_cache_size设置的可能过大,可适度调小,如果缓存利用率非常高,同时Qcache_lowmem_prunes的值比较大,则表示query_cache_size的值设置的略小。


query_cache_min_res_unit的预估值参考计算公式: (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache

【八】.清理缓存

flush query cache 清理缓存碎片

reset query cache 清理缓存

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/328.html

分享给朋友:

“mysql查询缓存” 的相关文章

MySql基本的建表原则

MySql基本的建表原则

1.定长和变长的分离 如int,char,time所占字节是固定的字段放在一张表 如varchar,text所占字节不确定的字段放在一张表中2.常用字段和不常用字段进行分离,根据查询频率来设计3.一对多的关联表可以添加冗余字段,如商品分类表 和商品表 ,在首页中需要显示每个分类商...

 mysql视图有什么用, mysql视图的学习

mysql视图有什么用, mysql视图的学习

我们从一个结果集中查询信息一般都是select *  from (select...),每次都要编写from (select...)非常麻烦,于是我们将结果集保存起来,这就是视图的便利。创建视图的命令为:create   view  &nb...

mysql表视图管理语句

mysql表视图管理语句

1.查看所有表,包括视图表,show  tables;2.查看表结果,包括视图表,desc  表名3.查看建表过程,show   create   table  表名;4.查看建视图过程,show   create   view...

mysql常用函数

mysql常用函数

1.floor(x)返回小于x的整数,向下取整,用法,商品的价格是浮点型的,需要向下取整 eg:select id,title,floor(price)  from  shopgoods2.rand()返回0-1之间的随机数 select rand() select rand()...

mysql触发器,mysql触发器语法,mysql创建触发器

mysql触发器,mysql触发器语法,mysql创建触发器

    触发器是一种特殊的事务,可以监听到Mysql的(insert/update/delete)的操作并触发相应的(insert/update/delete)操作.    触发器的创建主要有4个要素:(1).监听地点(...

mysql恢复数据库,mysql数据库log文件恢复数据库

mysql恢复数据库,mysql数据库log文件恢复数据库

由于在开发中不小心删除客户上传的商品数据,客户本身也不好说话,只好恢复数据库,记录下过程。原理是数据库开启bin-log功能,然后再通过备份的bin-log进行数据库恢复。先查找备份的数据库日志二进制文件。一般在mysql的data文件夹中,文件名大概为mysql-bin.00001,具体看文件的修...