MySQL45讲之IO性能提升

本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。

binlog 的写入机制

binlog 的写入流程是:

先将日志写入到 binlog cache 中,然后再 write page cache 到磁盘(文件系统向内核申请的一块内存空间,当 MySQL 进程重启时,不影响这块空间),最后 fsync 到磁盘。

每个事务对应的 binlog 是不能拆开的,所以必须一次性保存。每个线程有自己的 binlog cache,通过 binlog_cache_size 参数设置,但是多个线程共享同一个 binlog 文件。如果 binlog cache 存不下,就会存到磁盘中。

binlog 的刷盘策略,即 write 和 fsync 的时机,是由参数 sync_binlog 控制的:

一般不会将 sync_binlog 设置为 0,那样可能会丢失大量的日志。为了提高 IO 性能,可能会将 sync_binlog 设置为 100 ~ 1000 的值,这样只会丢失最近的 N 条日志。

redo log 的写入机制

redo log 的写入流程:

先将日志记录在 redo log buffer 中,然后再 write page cache,最后 fsync 到磁盘。并且,有一个后台线程,每隔一段时间就会将 redo log buffer 同步到磁盘。(可能事务未提交,但也同步到磁盘的情况)

redo log 的刷盘策略,由 InnoDB 提供了 innodb_flush_log_at_trx_commit 参数控制,它有三种可能取值:

注意,如果把 innodb_flush_log_at_trx_commit 设置为 1,那么 redo log 在两阶段提交的第一个 prepare 阶段就会刷盘,第二个 commit 阶段只会 write page cache。

双”1″配置

MySQL 的双”1″配置指的就是 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1 。即一次事务提交,需要等待两次 fsync。

组提交(group commit)

这时候,你可能有一个疑问,这意味着我从MySQL看到的TPS是每秒两万的话,每秒就会写四万次磁盘。但是,我用工具测试出来,磁盘能力也就两万左右,怎么能实现两万的TPS?

解释这个问题,就要用到组提交 group commit 机制了。

这里,我需要先和你介绍日志逻辑序列号 LSN(log sequence number)的概念。LSN是单调递增的,用来对应redo log的一个个写入点。每次写入长度为length的redo log, LSN的值就会加上length。

组提交举例:

对于多个并发事务,他们都写完了 redo log buffer,准备持久化到磁盘,那么会从这些事务中选择一个 leader,然后取他们中最大的 LSN,让这个 leader 带着最大的 LSN 取写盘,这样小于 LSN 的日志就都写到了磁盘,也就完成了一个组提交,其他事务直接返回即可。

所以,一次组提交中事务越多,可以节省的 IOPS 也就越多。

MySQL 在进行两阶段提交时,redo log 和 binlog 都是可以使用组提交的。此外,为了提高 binlog 使用组提交的效果,可以设置 binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count 来实现:

注意,如果 sync_binlog 设置为 0,那么 binlog_group_commit_sync_delay 会进行延迟,但不会 fsync。

MySQL的IO性能优化

在此基础上,可以通过以下方式对其进行优化:

[En]

Based on the above, it can be optimized in the following ways:

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-promote-io-performance.html
Author: flowers-bloom
Title: MySQL45讲之IO性能提升

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508082/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Tomcat端口占用

    进入命令行命令:netstat -ano作用:查看所有端口占用 命令:netstat -aon|findstr 端口号port作用:查看端口号port占用情况 命令:taskkil…

    数据库 2023年6月11日
    055
  • 牛客SQL刷题第三趴——SQL必知必会

    【问题】编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回在描述中以先后顺序同时出现 toy 和 carrots …

    数据库 2023年6月16日
    086
  • 记一次MySql唯一索引在left join连表查询没走索引的问题

    在新建一张账单结算信息表bill_settlement_info的时候,建立的唯一索引uk_bill_no(bill_no,tenant_id)。由于列表查询用到该表的字段。所以在…

    数据库 2023年5月24日
    0111
  • MyBatis-Plus修改数据,会不会把其他字段置为null

    前两天在用MyBatis-Plus写了一张单表的增删改查,在写到修改的时候,就突然蹦出一个奇怪的想法。 MyBatis-Plus的BaseMapper中有两个关于修改的方法。如下:…

    数据库 2023年6月11日
    099
  • Spring Boot 整合Hibernate Validator

    Spring Boot 整合Hibernate Validator 代码仓库: https://github.com/Rain-with-me/JavaStudyCode/tree…

    数据库 2023年6月14日
    092
  • 容器化 | 一文搞定镜像构建方式选型

    作者:安树博 青云科技 PaaS 中间件开发工程师从事 PaaS 中间件服务(Redis/Memcached 等)开发工作,热衷对 NoSQL 数据库领域内技术的学习与研究 官方镜…

    数据库 2023年5月24日
    071
  • [LeetCode]1. 两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个…

    数据库 2023年6月9日
    083
  • 0811JDBC随笔

    1.JDBC体系系统 一组规范:接口 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)…

    数据库 2023年6月14日
    073
  • [spring]spring详细总结

    spring 1.spring简介 Spring框架是一个开源的应用程序框架,是针对bean的生命周期进行管理的轻量级容器。 Spring解决了开发者在J2EE开发中遇到的许多常见…

    数据库 2023年6月16日
    049
  • Android Studio更改SDK、Gradle以及模拟器默认下载位置

    版本:Android Studio Chipmunk | 2021.2.1 Patch 2时间:2022年9月1日 1、更改SDK位置 找到 File -> Settings…

    数据库 2023年6月16日
    081
  • ​探秘 Web 水印技术

    Web 水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印),本文将分别予以介绍,带你探秘…

    数据库 2023年6月14日
    0100
  • day03-MySQL基础知识02

    MySQL基础知识02 4.CRUD 数据库CRUD语句:增(create)、删(delete)、改(update)、查(Retrieve) Insert 语句 (添加数据) Up…

    数据库 2023年6月11日
    071
  • 计算机网络 | TCP 连接的建立 和 TCP 连接的断开

    TCP 连接的建立过程 一开始,客户端和服务端都处于 close 状态。 先是服务端监听某个端口,此时服务端处于 listen 状态。 这个时候客户端就可以发送连接请求报文了。 第…

    数据库 2023年6月11日
    0117
  • asp.net(C#)接MYSQL8.0版本报错的处理方法

    由于新的操作系统没有安装mysql,项目中需要使用到,于是安装了最新版本的mysql8.0.28(我安装的是社区版),如果你的项目是老项目,使用的mysql插件是比较老的版本,安装…

    数据库 2023年5月24日
    0184
  • DM8数据库备份还原的原理及应用

    ▷▶介质管理层(MML) DM8根据自身实现自定义了一套API接口SBT来负责备份数据在存储介质上的实际读写操作。 整个存储介质上的读写操作,由MML调用SBT完成。 目前 DM8…

    数据库 2023年6月11日
    076
  • SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(…

    数据库 2023年5月24日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球