mysql性能优化-延迟写和异步写优化

MySQL 性能优化中的延迟写异步写优化是数据库写入操作中非常重要的技术手段。这些技术可以有效减少磁盘 I/O 操作、提高数据库的吞吐量和整体性能。尤其是在高并发写操作场景下,通过优化写入过程,减少阻塞和等待时间,可以大幅度提升系统的响应速度和并发处理能力。

一、写操作的基本原理

在 MySQL 中,写操作涉及的步骤较为复杂,通常包括以下几个关键过程:

  1. 写入缓冲区:数据被写入缓冲区,等待后续的磁盘 I/O 操作。
  2. 事务日志(redo log 和 binlog)记录:对于事务型存储引擎(如 InnoDB),MySQL 会将每次的写操作记录到 redo logbinlog 中,以保证数据的一致性和可靠性。
  3. 刷盘操作:最终,数据被写入到磁盘(即持久化)。

在这个过程中,磁盘 I/O 是影响写操作性能的主要瓶颈,因为磁盘的读写速度远远低于内存的访问速度。为了提升性能,MySQL 通过引入延迟写异步写技术,来减少每次写操作时的等待时间。

二、延迟写(Delayed Write)

延迟写是一种通过缓冲写操作来减少磁盘 I/O 的技术。MySQL 并不是在每次接收到写请求后立刻将数据写入磁盘,而是先将数据写入内存缓冲区,等待合适的时机(如缓冲区满或定时器到期)再进行批量写入磁盘。这种做法可以有效减少写操作的次数,提升写入性能。

1. InnoDB Buffer Pool 的延迟写机制

对于 InnoDB 存储引擎,Buffer Pool 是用于缓存数据页和索引页的内存区域。当进行写操作时,数据首先被写入 Buffer Pool 中,并标记为 “脏页”(Dirty Page),表示该页的内容已经被修改但还未写入磁盘。InnoDB 会根据一定的策略将这些脏页写入磁盘,而不是每次写操作立即触发 I/O。

2. 延迟写的优势
  • 减少磁盘 I/O 次数:通过延迟写机制,可以将多个小的写操作合并为一次大的写操作,显著减少磁盘写入次数,降低 I/O 压力。
  • 提高写操作吞吐量:由于写操作不需要等待立即刷盘,因此可以提高写入的并发处理能力。
  • 改善系统性能:延迟写机制使得系统能够更有效地利用内存和磁盘资源,提升整体性能。
3. 配置与优化

innodb_max_dirty_pages_pct 参数控制 Buffer Pool 中允许的脏页比例。默认情况下,当脏页占比达到一定百分比时,InnoDB 会触发写入操作。

SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct';

默认值通常是 75%,这意味着当脏页占用 Buffer Pool 的 75% 时,InnoDB 会开始将脏页刷到磁盘。适当增大该值可以减少写入频率,从而提高性能,但同时也会增加宕机时丢失更多数据的风险。

SET GLOBAL innodb_max_dirty_pages_pct = 80;

优化策略

  • 增大 Buffer Pool:通过增大 innodb_buffer_pool_size,可以容纳更多数据在内存中,从而减少磁盘写入的频率。
SET GLOBAL innodb_buffer_pool_size = 8G;
  • 控制脏页比例:在高并发写场景下,可以适当增大 innodb_max_dirty_pages_pct,以延长数据在内存中的停留时间。
4. 延迟写的风险

虽然延迟写能够提升写操作性能,但它也增加了数据丢失的风险。如果系统崩溃或发生意外,尚未刷盘的脏页数据会丢失。因此,延迟写适用于对性能要求高但数据丢失风险较低的场景,或者可以通过其他手段(如 binlog)进行数据恢复。

三、异步写(Asynchronous Write)

异步写是一种让写操作不阻塞应用的技术。当进行写操作时,MySQL 不会等待数据写入磁盘完成后再返回给客户端,而是将数据写入缓冲区后立即返回,后台线程会异步地将数据写入磁盘。这大大减少了写操作的等待时间,提升了系统的并发处理能力。

1. InnoDB 的异步写机制

InnoDB 存储引擎使用异步写来处理大量的写入操作,主要涉及以下几种异步写机制:

  • 异步提交:MySQL 将数据写入 redo log 后立即返回客户端,而不是等待事务日志刷入磁盘。innodb_flush_log_at_trx_commit 参数决定了这种异步提交的行为。

    • innodb_flush_log_at_trx_commit=0:表示 MySQL 会定期刷新事务日志(通常每秒一次),但不会在每次提交事务时刷新日志。
    • innodb_flush_log_at_trx_commit=1:表示每次事务提交时都会立即将日志刷到磁盘,最安全但最慢。
    • innodb_flush_log_at_trx_commit=2:表示每次提交事务时只将日志写入操作系统缓存,不会立即刷盘,稍微提高了性能,但数据安全性稍差。
    SET GLOBAL innodb_flush_log_at_trx_commit = 2;
    
2. 配置与优化

异步写的配置主要围绕 innodb_flush_log_at_trx_commit 参数。对于性能要求较高而数据安全性要求较低的系统,可以选择 innodb_flush_log_at_trx_commit=2,以提升写操作的性能。

优化策略

  • 降低刷盘频率:通过设置 innodb_flush_log_at_trx_commit=2,可以减少磁盘刷写的频率,提升写入性能。
  • 适当配置 sync_binlog:在使用 binlog 进行复制的系统中,可以将 sync_binlog 设置为 0,表示 MySQL 不会每次写入 binlog 时都进行刷盘,这可以进一步提高性能。
SET GLOBAL sync_binlog = 0;
3. 异步写的风险

异步写的主要风险在于数据一致性。如果发生系统崩溃,由于日志和数据尚未写入磁盘,可能导致数据丢失或不一致。因此,异步写适用于高性能、低延迟的场景,尤其是在对数据丢失风险有一定容忍度的系统中(如临时数据、日志数据等)。

四、MySQL 的双写机制(Doublewrite Buffer)

为了减少脏页写入时出现崩溃导致数据损坏的风险,InnoDB 引入了双写机制。该机制会将脏页的数据先写入到一个独立的 doublewrite buffer,然后再将数据写入磁盘。即使系统崩溃,也能通过 doublewrite buffer 恢复数据,保证数据一致性。

innodb_doublewrite 参数控制双写机制,默认为开启状态。虽然双写机制稍微增加了写操作的开销,但它能够显著提高数据的安全性。

SHOW VARIABLES LIKE 'innodb_doublewrite';

关闭双写机制可以提高性能,但会增加崩溃恢复的复杂性和风险。通常情况下,建议保持该功能开启,以保障数据安全。

SET GLOBAL innodb_doublewrite = 1;

五、延迟写与异步写的优化实践

在实际的 MySQL 优化中,可以通过调整延迟写和异步写的策略来平衡性能与数据一致性。

1. 针对高并发写操作的优化

对于具有大量并发写操作的系统,如社交网络、日志系统等,可以通过以下方式优化写入性能:

  • 增大 Buffer Pool:通过 innodb_buffer_pool_size 增大内存缓存空间,减少磁盘 I/O。
  • 延长脏页滞留时间:通过增大 innodb_max_dirty_pages_pct 允许更多脏页滞留在内存中。
  • 设置异步刷盘:将 innodb_flush_log_at_trx_commit 设置为 2,减少频繁的刷盘操作。
2. 针对对数据一致性要求

高的场景

对于数据一致性要求高的场景(如金融系统、订单系统等),即使牺牲一些性能,也需要保证数据的安全性:

  • 开启双写机制:保持 innodb_doublewrite 为开启状态,防止崩溃后数据损坏。
  • 设置同步刷盘:将 innodb_flush_log_at_trx_commit 设置为 1,每次提交事务都刷盘,确保数据安全。

六、总结

MySQL 的延迟写和异步写技术可以显著提高写操作的性能,尤其是在高并发、大量写入的场景下,它们通过减少磁盘 I/O 操作、提高写入吞吐量,改善了系统的响应速度。然而,这些技术在提升性能的同时,也带来了数据一致性和持久性方面的风险。

在实际项目中,开发者需要根据业务需求和应用场景权衡性能与数据安全,合理配置 MySQL 的延迟写和异步写机制。通过调整 innodb_buffer_pool_sizeinnodb_flush_log_at_trx_commit 等关键参数,可以在性能和安全性之间找到最佳的平衡点,确保系统在高负载下依然能够稳定高效运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cassandra 5.0 Spring Boot 3.3 CRUD

概览 因AI要使用到向量存储,JanusGraph也使用到Cassandra 卸载先前版本 docker stop cassandra && docker remove cassandra && rm -rf cassandra/运行Cassandra容器 docker run \--name cassandra \--hostname cassandra \-p 9042:9042 \--pri…

【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器:嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理! 其中就Observe监听类的使用,Object…

ZXing.Net:一个开源条码生成和识别器,支持二维码、条形码等

推荐一个跨平台的非常流行的条码库,方便我们在.Net项目集成条码扫描和生成功能。 01 项目简介 ZXing.Net是ZXing的.Net版本的开源库。支持跨多个平台工作,包括 Windows、Linux 和 macOS,以及在 .NET Core 和 .NET Framework 上运行。 解码…

硬件看门狗导致MCU启动时间慢

最近,在项目交付过程中,我们遇到了一个有趣的问题,与大家分享一下。 客户的需求是:在KL15电压上电后,MCU需要在200ms内发送出第一包CAN报文数据。然而,实际测试结果显示,软件需要360ms才能发送…

【通俗易懂介绍OAuth2.0协议以及4种授权模式】

文章目录 一.OAuth2.0协议介绍二.设计来源于生活三.关于令牌与密码的区别四.应用场景五.接下来分别简单介绍下四种授权模式吧1.客户端模式1.1 介绍1.2 适用场景1.3 时序图 2.密码模式2.1 介绍2.2 适用场景2.3时序图 3.授权码模式3.1 介绍3.2 适用场景3.3 时序图 4.简化模式4.1 …

第二百四十一节 JPA教程 - JPA一对一主键连接列示例、JPA一对一映射级联示例

JPA教程 - JPA一对一主键连接列示例 例子 下面的代码来自Person.java。 package cn.w3cschool.common; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.p…

MES系统如何提升制造企业的运营效率和灵活性

参考拓展:苏州稳联-西门子MES系统-赋能智能制造的核心引擎 制造执行系统(MES)在提升制造企业运营效率和灵活性方面发挥着关键作用。 一、MES系统的基本概念和功能 MES系统是连接企业管理层与生产现场的重要桥梁。它主要负责生产调度、资源管理、质量控制等多个方…

Dockerfile自定义制作镜像,其中10个指令的作用分析

docker容器中 做镜像是重要的技能。 docker commit只能制作比较简单的镜像, 要制作比较完善的镜像, 自定义程度比较高的, 就需要用到dockerfile dockerfile可以回溯历史 动态生成镜像。 FROM是基础镜像 CMD是在容器创建的时候默认的启动命令 …

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击,是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络,向目标发送大量看似合法的请求,从而占用大量网络资源使网络瘫痪,阻止用户对网络资源的正…

Android webview拦截H5的接口请求并返回处理好的数据

Android webview拦截H5的接口请求并返回处理好的数据 Android 可以通过 WebView 的 shouldInterceptRequest 方法拦截到 H5 中的网络请求。这是一个 WebViewClient 中的回调方法,允许开发者在 WebView 发起网络请求时对其进行处理和修改。 具体使用方法如下&#…

TMStarget学习——T1 Segmentation数据处理及解bug

最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤: (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…

OpenAI o1团队突破性论文:『过程推理』中数学推理能力大幅提升,从正确中学习的新方法

原创 超 近年来,大型语言模型(LLMs)在复杂的多步推理任务中取得了令人瞩目的进展。这些模型能够生成逐步的思维链,解决从小学数学到高等微积分的各种问题。然而,即使是最先进的模型也常常陷入逻辑陷阱,产生看似合理但实际错误的推…

只装了WPS,DOC文档无法打开

只装了WPS,DOC文档无法打开 打开WPS --> 全局设置 --> 设置 --> 文件格式关联 --> 与office 2007兼容 也可以选择office 2003 或 office 2010 兼容 dox文件的默认打开方式也变为WPS

1.3 计算机网络的分类

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言一、按分布范围分类二、按传输技术分类三、按拓扑结构分类四、按使用者分类五、按传输介质分类 前言 计算机网络根据不同的标准可以被分为多种类型,本章从分布…

iostat 命令:系统状态监控

一、命令简介 ​iostat ​命令用于报告系统中 CPU、磁盘、tty 设备和 CPU 利用率统计信息。 ‍ 需安装 sysstat ​软件包,该软件包提供了一组工具,包括 iostat​、sar​、mpstat ​等,用于系统性能监控和报告。 ‍ 二、命令参数 iostat…

STM32 MPU加速效果测试

测试代码&#xff1a; static volatile uint32_t cnt;cnt 0;uint64_t time time_spent({while (cnt < 1000000){cnt;}});log_info("test time spent: %llu us\r\n", time); 结果&#xff1a; //未开启Cache fmc_ram test: uint32_t spent time: 955963 us uin…

STM32之串口通信

什么是串口 串行通信接口&#xff1a;指按位发送和接收的接口&#xff0c;如RS232/422/485 RS232电平和COMS/TTL电平对比 RS232电平&#xff1a;逻辑1&#xff1a;-15V ~ -3V 逻辑0:3V ~ 15V CMOS电平: 逻辑1&#xff1a;3.3V 逻辑0&#xff1a;0V &#xff08;STM32使用&am…

服务注册中心对比及使用场景分析

目录 引言服务注册中心简介注册中心对比 1. Consul 1.1 介绍1.2 特性1.3 使用场景1.4 AP vs CP 2. Nacos 2.1 介绍2.2 特性2.3 使用场景2.4 AP vs CP 3. ZooKeeper 3.1 介绍3.2 特性3.3 使用场景3.4 AP vs CP 对比表格选择建议总结 引言 随着微服务架构的普及&#xff0c;服…

QT----基于QML的计时器

赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel class TimeListModel : public QAbstrac…

前端大屏自适应方案

一般后台管理页面&#xff0c;需要自适应的也就是大屏这一个&#xff0c;其他的尺寸我感觉用第三方框架继承好的就挺合适的&#xff0c;当然自适应方案也可以同步到所有页面&#xff0c;但我感觉除了 to c 的项目&#xff0c;不太需要所有页面自适应&#xff0c;毕竟都是查看和…