作者及简介:

黄 炎,爱可生首席技术官;

王 悦,爱可生研发团队成员,负责数据库管理平台相关项目的开发和故障排查,好奇 MySQL 技术原理及各类数据库实现方案。

本文来源:转载自公众号-图解 MySQL

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

一条 insert 语句在写入磁盘的过程中到底涉及了哪些文件?顺序又是如何的?下面我们用两张图和大家一起解析 insert 语句的磁盘写入之旅。

图 1:事务提交前的日志文件写入

旅途过程:首先 insert 进入 server 层后,会进行一些必要的检查,检查的过程中并不会涉及到磁盘的写入。

检查没有问题之后,便进入引擎层开始正式的提交。我们知道 InnoDB 会将数据页缓存至内存中的 buffer pool,所以 insert 语句到了这里并不需要立刻将数据写入磁盘文件中,只需要修改 buffer pool 当中对应的数据页就可以了。buffer pool 中的数据页刷盘并不需要在事务提交前完成,其中的交互过程我们会在下一张图中分解。

但仅仅写入内存的 buffer pool 并不能保证数据的持久化,如果 MySQL 宕机重启了,需要保证 insert 的数据不会丢失。redo log 因此而生,当 innodb_flush_log_at_trx_commit=1 时,每次事务提交都会触发一次 redo log 刷盘。(redo log 是顺序写入,相比直接修改数据文件,redo 的磁盘写入效率更加高效)

如果开启了 binlog 日志,我们还需将事务逻辑数据写入 binlog 文件,且为了保证复制安全,建议使用 sync_binlog=1 ,也就是每次事务提交时,都要将 binlog 日志的变更刷入磁盘。

综上(在 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 ,尽量合并一些数据页后再写入实际的非聚集索引中去。

图 2:事务提交后的数据文件写入

旅途过程:当 buffer pool 中的数据页达到一定量的脏页或 InnoDB 的 IO 压力较小 时,都会触发脏页的刷盘操作。

当开启 double write 时,InnoDB 刷脏页时首先会复制一份刷入 double write,在这个过程中,由于double write的页是连续的,对磁盘的写入也是顺序操作,性能消耗不大。

无论是否经过 double write,脏页最终还是需要刷入表空间的数据文件。刷入完成后才能释放 buffer pool 当中的空间。

insert buffer 也是 buffer pool 中的一部分,当 buffer pool 空间不足需要交换出部分脏页时,有可能将 insert buffer 的数据页换出,刷入共享表空间中的 insert buffer 数据文件中。

当 innodb_stats_persistent=ON 时,SQL 语句所涉及到的 InnoDB 统计信息也会被刷盘到 innodb_table_stats 和 innodb_index_stats 这两张系统表中,这样就不用每次再实时计算了。

有一些情况下可以不经过 double write 直接刷盘关闭 double write

不需要 double write 保障,如 drop table 等操作

汇总两张图,一条 insert 语句的所有涉及到的数据在磁盘上会依次写入 redo log,binlog,(double write,insert buffer) 共享表空间,最后在自己的用户表空间落定为安。

mysql 写磁盘_图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅相关推荐

  1. mysql写系统_一个用PHP和MYSQL写的定饭系统_PHP

    前台html 定饭 http://www.gaodaima.com/66512.html一个用php和mysql写的定饭系统_PHP vlink="#3366CC" alink=& ...

  2. insert 语句_[原理解析] MySQL insert语句的磁盘写入之旅

    一条insert语句在写入磁盘的过程中到底涉及了哪些文件,顺序又是如何的?下面我们用两张图和大家一起解析insert语句的磁盘写入之旅. 图1: 事务提交前的日志文件写入 旅途过程: 首先 inser ...

  3. mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  4. mysql新增字段位置_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  5. mysql单表瓶颈_mysql单表性能瓶颈_优化系列 | 实例解析MySQL性能瓶颈排查定位-云栖社区-阿里云...

    导读 从一个现场说起,全程解析如何定位性能瓶颈. 排查过程 收到线上某业务后端的MySQL实例负载比较高的告警信息,于是登入服务器检查确认. 1. 首先我们进行OS层面的检查确认 登入服务器后,我们的 ...

  6. Mysql disk write 高_优化系列|实例解析MySQL性能瓶颈排查定位 导读 排查过程

    导读 从一个现场说起,全程解析如何定位性能瓶颈. 排查过程 收到线上某业务后端的MySQL实例负载比较高的告警信息,于是登入服务器检查确认. 1. 首先我们进行OS层面的检查确认 登入服务器后,我们的 ...

  7. mysql主从数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题

    作者:戴骏贤 网易游戏 技术部资深数据库系统工程师. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 问题起源 不久前用户反馈部门的 MySQ ...

  8. mysql写偏斜_【MySQL】探究之常用SQL

    一些SQL命令(不断更新,我总记不住,哭) List 建库建表 GBK: CREATE DATABASE `test_db1` DEFAULT CHARACTER SET gbk COLLATE gb ...

  9. java mysql安装教_大学java教案之MySQL安装图解

    一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行"setup.exe". 2.选择安装类型,有"Typ ...

最新文章

  1. python内置函数用来返回数值型序列中所有元素之和_Python内置函数______用来返回数值型序列中所有元素之和...
  2. opencv-3.3安装记录-ubuntu 14.04
  3. cx_Freeze脚本实现--Python使用cx_Freeze编译可执行文件(exe,mac)
  4. P3047 [USACO12FEB]附近的牛Nearby Cows
  5. 如何创建免费的Hyper-V Server故障转移集群
  6. Spring boot的helloword
  7. Python之文章生成器(升级版,也就是更傻瓜式运行)
  8. REST和微服务——用异步交互分解单体系统
  9. 利用计算机模拟专家给病人,《计算机应用基础2007》复习资料
  10. Atitit 软件设计中的各种图纸 uml 之道 1. 常见设计成果与图纸 2 1.1. 总图 2 1.2. ui原型图与html 2 1.3. 业务逻辑 伪代码 各种uml图 2 1.4. 总体
  11. CSS禅意花园初始页面布局分析
  12. html个性签名,经典的个性签名设计
  13. Java最新学习笔记(2020版)丨基于JKD1.8
  14. AnkhSvn 在vs2015中没有起到作用问题
  15. MFC在两控件间画线
  16. 抖音做我女朋友的 vbs 脚本
  17. EF实体类种的Virtual关键字作用
  18. 51nod 1072 威佐夫游戏
  19. Angular4 第三章(中) 重定向路由,子路由,辅助路由
  20. Linux(redhat7.2)本地yum源配置

热门文章

  1. android遥控器按键传输流程,android 海思平台遥控器按键映射流程
  2. java ee io_JAVAEE细细看 进阶 14 - IO总结-Go语言中文社区
  3. [蓝桥杯][算法提高VIP]开灯游戏(dfs)
  4. Codeforces Round #572 (Div. 2)(ABCD1D2E)
  5. Python机器学习---2.聚类分析代码部分
  6. oracle自带调优,oracle 参数调优
  7. centos mysql 远程连接_Linux下开启MySQL的远程连接
  8. 计算指数c语言2的n次方,计算2的N次方........有什么错吗?
  9. ajax 与route的区别,浅析vue-router jquery和params传参(接收参数)$router $route的区别
  10. 『Python』python 弹窗、提示和警告框MessageBox部件