
文章图片
文章图片
文章图片
前言MySQL中执行一条SQL语句 , 相应表数据的读写都是由存储引擎去做(更新数据、查询数据) 。
在这个过程 , 存储引擎需要决策一些事情
- 数据是从内存查还是从硬盘查
- 数据是更新在内存 , 还是硬盘
- 内存的数据什么时候同步到硬盘
我们可以按需选择存储引擎 , 比如常见的InnoDB、MyISAM、Memory等等 。
众多存储引擎中 , InnoDB是最为常用的 , 从MySQL5.5.8版本开始 , InnoDB是默认的存储引擎 。
InnoDB简介InnoDB存储引擎支持事务 , 其设计目标主要面向在线事务处理(OLTP)的应用 。
特点是行锁设计、支持MVCC、外键 , 提供一致性非锁定读 , 同时本身设计能够最有效地利用内存和CPU , 是MySQL最常用的存储引擎 。
InnoDB的重要内存结构
InnoDB存储引擎在内存中有两个非常重要的组件 , 分别是缓冲池(Buffer Pool)和重做日志缓存(redo log buffer) 。
Buffer Pool简介缓冲池(Buffer Pool)里面会缓存很多的数据 , 比如数据页、索引页、锁信息等等 。
MySQL表数据是以页为单位 , 你查询一条记录 , 会从硬盘把一页的数据加载出来 , 加载出来的数据叫数据页 , 会放入到Buffer Pool中 。
后续的查询先从Buffer Pool中找 , 没有命中再去硬盘加载 , 减少硬盘IO开销 , 提升性能 。
更新表数据的时 , 如果Buffer Pool里命中数据 , 就直接在Buffer Pool里更新 。
总之Buffer Pool会缓存很多的数据 , 以便后续的查询与更新 。
小贴士:这里只是用数据页举例帮助大家理解 , 大家千万不要认为Buffer Pool里面只有数据页 , 它只是占Buffer Pool大部分空间 , 关于Buffer Pool更多细节 , 后续会有专门的文章讲解 。
redo log buffer简介接着思考一个问题 , 假设我们把Buffer Pool中某个数据页的某条数据修改了 , 但是硬盘的数据还未同步 , 此时数据是不一致的 , 如果MySQL宕机了 , 数据就丢失了 。
这可怎么办呢 。
为了保证数据的持久性 , InnoDB存储引擎加入了redo日志功能 , 也叫重做日志 。
每当我们对表数据进行更新时 , 会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里 。
当事务提交时 , 会把redo log buffer清空 , 刷盘到redo日志文件 。
这样MySQL宕机了也没关系 , 因为重启后会根据redo日志去恢复数据 。
小贴士:redo日志细节也很多 , 本文只做个介绍 , 后续会有专门的文章讲解 。
小结【尼康|浅谈 MySQL InnoDB 的内存组件】其实不难发现 , 缓冲池(Buffer Pool)和重做日志缓存(redo log buffer) , 它们都是为了减少硬盘IO开销 。
- 设计有创新,细节尽显精致质感,vivo S15系列满眼皆美
- 三星这一刀,不得不砍
- Redmi K40S跌至2399元,到底值不值得入手呢?
- 索尼“心比天高”,12GB+512GB保持在8999价位,买得起的人很少
- 隐藏在我们评测里的这个小秘密,你发现了吗
- 手机库存水位高 传联发科下修Q3投片量
- 最佳“记录员”丨记下生活美好瞬间,Insta360影石 GO2相机体验
- 三星GalaxyF62反击国产,安排7000mAh大电量电池,续航太强
- 键盘上这些被厂商抠掉的功能键,到底有多没用?
- 魅族卖身吉利,黄章退隐江湖
