Blogger Information
Blog 9
fans 0
comment 0
visits 14537
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
mysql缓存机制
小张的博客
Original
2638 people have browsed it

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

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post