Mysql的缓存机制

参考

陈Chuan大佬系列,简书过500赞的博客
https://www.jianshu.com/p/d7665192aaaf

Mysql缓存原理
https://blog.csdn.net/qzqanzc/article/details/80418125
https://blog.csdn.net/songjianyue12345/article/details/77340168

Mysql的缓存功能

https://blog.csdn.net/songjianyue12345/article/details/77340168

对于一个并没有那么复杂的系统,但是某几个表特别大的时候,缓存是一个很实用的一个功能,是SQL优化和查询提速的常用操作,开启Mysql自带的此功能,实现查询结果缓存的同时,缓存失效的维护由数据库自己完成,而不像一般的Spring框架要通过代码或者过期自动超时来维护。当然,这个功能并不适合海量数据缓存,Mysql缓存还设计内存碎片的问题,需要定期手动维护。也不适合高性能数据缓存的业务场景,专业的缓存还是要用redis、ehcache来处理。

mysql缓存维护的方式简单暴力,只要查询涉及的表中有更新操作,就清空该表相关的所有缓存(多表关联查询就更严重,但凡有一个表更新了,该SQL缓存就失效了),基于这种逻辑就可以保证所有的数据是最新的,不用涉及超时时间的概念。当然使用缓存功能会增加一部分数据的开销,来实现热点数据的缓存快速查询,从而提升用户的体验。
结合业务场景,一般都是开启DEMAND模式,使用在不需要频繁变动的表上。频繁变更的表上如果开启缓存功能,会影响数据库的维护性能。

  1. MySQL将缓存存放在一个引用表(不要理解成table,可以认为是类似于HashMap的数据结构),通过一个哈希值索引,这个哈希值通过查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息计算得来。所以两个查询在任何字符上的不同(例如:空格、注释),都会导致缓存不会命中。
  2. 既然是缓存,肯定是保存在内存当中,重启后会失效。
  3. 如果这个表修改了,那么使用这个表中的所有缓存将不再有效,查询缓存值得相关条目将被清空。表中得任何改变是值表中任何数据或者是结构的改变,包括insert,update,delete,truncate,alter table,drop table或者是drop database 包括那些映射到改变了的表的使用merge表的查询,
  4. 对于频繁更新的表,查询缓存不合适,对于一些不变的数据且有大量相同sql查询的表,查询缓存会节省很大的性能
  5. 缓存不可用的情况:
  • 使用缓存必须确保SQL完全一样,SQL字母大小写、空格、注释等都会导致缓存匹配失败
  • SQL中包含不确定的函数,则缓存功能不可用,比如 now(),CURRENT_DATE() ,比如 select * from wx_ib where war_exp_date=CURRENT_DATE();
  • 缓存要查询的表,正在被另外一个事务修改数据
  1. 注意事项:
  • 比较遗憾的是,缓存清空的机制是目标表有任何更新操作,都会导致该表的所有缓存失效,而不能实现行级别的缓存清空
  • 事务隔离级别为:Serializable情况下,所有查询语句都不能缓存;

PK 其它缓存

  1. Mysql清除缓存的方式太过暴力,只要缓存查询的SQL查询,涉及到的表有更新操作,那么这个缓存查询就会失效,无法实现行级的缓存清除
  2. Spring集成第三方缓存工具和相关注解,可以实现更灵活的缓存处理,比如清除某个key的缓存,而不是整个表的缓存都清除
  3. 专业的缓存工具一般都支持,缓存数据持久化、FIFO策略等功能

Mysql缓存功能的开启

  1. 配置和启动:修改mysql安装目录下面的my.ini文件,添加query_cache_type=2(开启DEMAD模式),然后重启mysql(windows重启的话,admin模式 net stop mysql ,net start mysql。 linux: service mysql restart)
    缓存开启的设置:query_cache_type
  2. OFF: 关闭,默认 值为0
  3. ON: 总是打开,值为1
  4. DEMAND: 只有明确写了SQL_CACHE的查询才会进入缓存,值为2
  • query_cache_type 这个参数windows下必须在my.ini文件里配置,默认是0 表示关闭缓存功能,设置为1 表示开启全部的缓存,设置为2表示DEMAND模式
  • query_cache_limit 限制查询缓存区最大能缓存的查询记录集,可以避免一个大的查询记录集占去大量的内存区域,而且往往小查询记录集是最有效的缓存记录集,默认设置为1M,建议修改为16k~1024k之间的值域,不过最重要的是根据自己应用的实际情况进行分析、预估来设置;,支持在线配置,立即生效
  • query_cache_min_res_unit 设置查询缓存分配内存的最小单位,要适当地设置此参数,可以做到为减少内存块的申请和分配次数,但是设置过大可能导致内存碎片数值上升。默认值为4K,建议设置为1k~16K
  • Qcache_hits 查看命中缓存查询的次数
#my.ini里面配置
query_cache_type=2
set global query_cache_limit = 1024 * 1024 * 5;

show status like '%qcache_hits%';
  1. 缓存的使用: SQL_NO_CACHE/ SQL_CACHE
select  SQL_CACHE * from wx_ib where product_id=1246 and war_exp_date='2016-08-07';
select  SQL_NO_CACHE * from wx_ib where product_id=1246 and war_exp_date='2016-08-07';

缓存开启的时机:

  1. 缓存开启带来的必要开销:
  • 该表发生事务操作的时候,都要清空相关的缓存
  • 在query_cache_type为ON的模式下,该数据库全部的查询都会先尝试缓存,不管该查询是否会有热点数据,而实际的业务场景并不是这样。所以更建议使用DEMAND模式。
  • 开启缓存后,所有的Query完成之后,都要把查询结果插入到缓存当中
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容