博客列表 >mysql缓存机制

mysql缓存机制

小张的博客
小张的博客原创
2019年12月26日 10:12:522635浏览

mysql缓存机制

mysql缓存机制就是缓存sql文件及其结果,用KV形式保存在服务器内存中,如果运行相同的sql,服务器直接从缓存中去获取结果,不需要再去解析、优化、执行sql。如果这个表修改了,那么使用这个表中的所有缓存将不再有效,查询缓存值的相关条目将被清空。如果查询有不确定的数据如:now(),current_date(),那么查询完成后结果值不会被缓存,包含不确定的数据是不会放置到缓存中的。显然,对于频繁更新的表,查询缓存不合适,对于一些不变的数据且大量相同sql查询的表,查询缓存会节省很大的性能。

工作流程:缓存存在hash表中

1.服务器接收SQL,以SQL和一些其他条件(客户端协议)作为key查找缓存表
2.如果找到了缓存,则直接返回缓存
3.如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等
4.执行完SQL查询结果以后,将SQL查询结果缓存入缓存表

缓存的使用时机

衡量打开缓存是否对系统有性能提升是一个很难的话题
1.通过缓存命中率判断,缓存命中率 = 缓存命中次数(Qcache_hits)/ 查询次数(Com_select)
2.通过缓存写入率,写入率 = 缓存写入次数(Qcache_inserts)/ 查询次数(Qcache_select)
3.通过命中-写入率判断,比率 = 命中次数(Qcache_hits)/写入次数(Qcache_inserts)
高性能MYSQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,最好能达到10:1

GLOBAL STAUS 中 关于 缓存的参数解释:
Qcache_free_blocks: 缓存池中空闲块的个数
Qcache_free_memory: 缓存中空闲内存量
Qcache_hits: 缓存命中次数
Qcache_inserts: 缓存写入次数
Qcache_lowmen_prunes: 因内存不足删除缓存次数
Qcache_not_cached: 查询未被缓存次数,例如查询结果超出缓存块大小,查询中包含可变函数等
Qcache_queries_in_cache: 当前缓存中缓存的SQL数量
Qcache_total_blocks: 缓存总block数

开启缓存
有两种方式,一种是使用set命令来进行开启,另一种是直接修改my.ini文件来直接设置

1、修改配置文件my.ini    //windows下是my.ini,linux下是my.cnf;
在配置文件的最后追加上:
query_cache_type = 1
query_cache_size = 600000
重启mysql生效

2、命令方式
set global query_cache_type = 1;
set global query_cache_size = 600000;
如果报错:query cache is disabled;restart the server with query_cache_type=1...
在mysql命令行输入
show variables like "%query_cache%" 查看是否设置成功

二、查看是否生效
1、query_cache_type  //使用查询缓存的方式0代表缓存OFF,1代表ON,2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存
如:select SQL_CACHE user_name,user_age from users where user_id = '1';
当你不想要使用缓存时: select sql_no_cache user_name from users where user_id = '1'

2、have_query_cache //设置查询缓存是否可用  YES
3、query_cache_size //查看缓存大小 单位是 B  mysql6.0版本默认是 16777216  16M,之前的版本是0
4、query_cache_limit //控制缓存查询结果的最大值   数据大小超过这个值就不会进行缓存

5、show status like '%Qcache%'; //查看缓存的状态
    Qcache_free_blocks        //目前处于空闲状态的Query Cache 中内存Block数目
    Qcache_free_memory        //目前还处于空闲状态的Query Cache 内存总量
    Qcache_hits               //Query Cache 命中次数
    Qcache_inserts            //向Query Cache中插入新的Query Cache的次数,也就是没有命中的次数
    Qcache_lowmem_prunes      //当Query Cache内存容量不够,需要从中删除老的Query Cache 以给新的Cache对象使用的次数
    Qcache_not_cached         //没有被Cache的sql数,包括无法被Cache的SQL以及由于query_cache_type设置的不会被Cache的SQL
    Qcache_queries_in_cache   //目前在Query Cache中的SQL数量
    Qcache_total_blocks       //Query Cache 中宗的Block数量

6、检查查询缓存使用情况
检查是否从查询缓存中受益的最简单的办法就是检查缓存命中率
当服务器收到SELECT语句的时候,Qcache_hits和Com_select这两个变量会根据查询缓存的情况进行递增
查询缓存命中率的计算公式是:Qcache_hits/(Qcache_hits + Com_select)    //show status like '%Com_select%'   表示查询次数

query_cache_min_res_unit的配置是一柄“双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据,就容易造成内存碎片和浪费
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE 整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查询缓存利用率在25%以下说明query_cache_size设置过大,可适当减小;利用率在80%以上而且Qcache_lowmem_prunes大于50的话说明query_cache_size可能有点小,要不就是碎片太多
查询缓存命中率 = (Qcache_hits - Qcache_inserts)/Qcache_hits * 100%

缓存清理
FLUSH QUERY CACHE; //清理查询缓存内存碎片
RESET QUERY CACHE; //从查询缓存中移出所有查询
FLUSH TABLES; // 关闭所有打开的表,同时该操作将会清空查询缓存中的内容

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议