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; // 关闭所有打开的表,同时该操作将会清空查询缓存中的内容