做者及简介:
黄 炎,爱可生首席技术官;
王 悦,爱可生研发团队成员,负责数据库管理平台相关项目的开发和故障排查,好奇 MySQL 技术原理及各种数据库实现方案。
本文来源:转载自公众号-图解 MySQL
*爱可生开源社区出品,原创内容未经受权不得随意使用,转载请联系小编并注明来源。
一条 insert 语句在写入磁盘的过程当中到底涉及了哪些文件?顺序又是如何的?下面咱们用两张图和你们一块儿解析 insert 语句的磁盘写入之旅。数据库
综上(在 InnoDB buffer pool 足够大且上述的两个参数设置为双一时),insert 语句成功提交时,真正发生磁盘数据写入的,并非 MySQL 的数据文件,而是 redo log 和 binlog 文件。然而,InnoDB buffer pool 不可能无限大,redo log 也须要按期轮换,很难容下全部的数据,下面咱们就来看看 buffer pool 与磁盘数据文件的交互方式。缓存
double write 背景
InnoDB buffer pool 一页脏页大小为 16 KB,若是只写了前 4KB 时发生宕机,那这个脏页就发生了写失败,会形成数据丢失。为了不这一问题,InnoDB 使用了 double write 机制(InnoDB 将 double write 的数据存于共享表空间中)。在写入数据文件以前,先将脏页写入 double write 中,固然这里的写入都是须要刷盘的。有人会问 redo log 不是也能恢复数据页吗?为何还须要 double write?这是由于 redo log 中记录的是页的偏移量,好比在页偏移量为 800 的地方写入数据 xxx,而若是页自己已经发生损坏,应用 redo log 也无济于事。安全
insert buffer 背景
InnoDB 的数据是根据汇集索引排列的,一般业务在插入数据时是按照主键递增的,因此插入汇集索引通常是顺序磁盘写入。可是不可能每张表都只有汇集索引,当存在非汇集索引时,对于非汇集索引的变动就可能不是顺序的,会拖慢总体的插入性能。为了解决这一问题,InnoDB 使用了 insert buffer 机制,将对于非汇集索引的变动先放入 insert buffer ,尽可能合并一些数据页后再写入实际的非汇集索引中去。性能
有一些状况下能够不通过 double write 直接刷盘spa
汇总两张图,一条 insert 语句的全部涉及到的数据在磁盘上会依次写入 redo log,binlog,(double write,insert buffer) 共享表空间,最后在本身的用户表空间落定为安。日志