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)

大家都在看

  • Java面向对象程序设计(1)类与对象

    类与对象 类和对象的联系 类是抽象的,是由程序员对一种事物进行抽象而构造的一种数据类型 对象是具体的,它是类的一个实例化 类是对象的模板,对象是类中的一个个体 类和对象的内存分配机…

    数据库 2023年6月16日
    074
  • 索引

    一种数据结构,帮助我们快速的定位元素 主键索引 唯一索引 普通索引 联合索引(最左匹配原则) 对某字段进行范围会使索引失效 全文索引 如何让性能优秀 减少I/O次数 避免回旋 根据…

    数据库 2023年6月11日
    069
  • leetcode 513. Find Bottom Left Tree Value 找树左下角的值 (简单)

    给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root = [2,1,3]输出: 1 示例 2…

    数据库 2023年6月16日
    085
  • 实时展示用户上传的头像

    实时展示用户上传的头像 总体思路 """ 1.首先需要&amp…

    数据库 2023年6月14日
    074
  • null和空字符串对于查询where条件语句的影响

    在数据库中我们进行数据处理的过程中,对于null值或者空字符串的情况对于这种数据我们进行计算平均值以及查询过程中如何进行对于这类数据的处理呢? step1:建表:create ta…

    数据库 2023年6月6日
    099
  • Virtualbox中ubuntu18配置静态ip地址及DNS

    python开发环境:VirtualBox+Ubuntu18.04 每当我重启电脑重新打开VirtualBox,Ubuntu中的IP地址都会改变,这样,我的开发软件的连接解析地址也…

    数据库 2023年6月6日
    0124
  • 【黄啊码】小程序:九宫格抽奖如何实现?可控制抽奖率

    如果让你用微信小程序获取经纬度,然后在后台计算距离,返回数据 一般人的逻辑就是:getLocation之后直接request 然而,当你request后才发现,根本没有弹窗,wha…

    数据库 2023年6月16日
    0148
  • 使用mybatis-plus转换枚举值

    1. 使用mybatis-plus转换枚举值 枚举值转换方式有很多,有以下方式: 后端写一个通用方法,只要前端传枚举类型,后端返回相应的枚举值前端去匹配 优点:能够实时保持数据一致…

    数据库 2023年6月11日
    0156
  • hosts文件作用

    1、加快域名解析对于要经常访问的网站,我们可以通过在Hosts中配置域名和IP的映射关系,提高域名解析速度。由于有了映射关系,当我们输入域名计算机就能很快解析出IP,而不用请求网络…

    数据库 2023年6月11日
    064
  • Redis集群(二)哨兵模式

    一、作用和架构 1. 作用 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入。哨兵的核心功能是 主节点的自动故障转移。下面是Redis官方文档对于哨…

    数据库 2023年6月11日
    091
  • 设计模式之(7)——装饰设计模式

    定义:装饰设计模式允许向一个现有的对象添加功能,而不改变其结构(这就很符合程序设计的” 开闭原则“),重点突出类功能的增强,属于结构型创建模式,这种模式创建…

    数据库 2023年6月14日
    081
  • 设计模式之(3)——抽象工厂方法模式

    定义:抽象工厂模式简单地讲,就是提供一个超级工厂,围绕这个超级工厂创建其他工厂;抽象工厂模式提供一个创建一些列相关或者相互依赖对象的接口; 在此之前我们先来讲一下产品等级和产品族的…

    数据库 2023年6月14日
    075
  • 【MySQL】笔记(2)— 部分 DQL 语句;条件查询;排序;分组函数;单行处理函数;group by ,having ;

    1.简单的查询语句(DQL): select 字段名1,字段名2,字段名3,…. from 表名; 注意:1、任何一条sql语句都以”;”结尾;…

    数据库 2023年5月24日
    0107
  • Git的使用

    1.前置篇 1.1 为什么要版本控制 1.2 什么是版本控制 1.3目前流行的版本控制软件有哪些 2.原理篇 2.1 GIT 概述 2.2 代码托管平台 2.3 GIT原理 3.安…

    数据库 2023年6月11日
    0103
  • 无根用户管理podman

    在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置 基础设置 cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资…

    数据库 2023年6月14日
    084
  • 线程池执行流程图

    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeU…

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