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 …

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

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

安全热点问题

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

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

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

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

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

1.3 计算机网络的分类

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

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

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

STM32CUBEIDE FreeRTOS操作教程(五):mutex互斥信号量

STM32CUBEIDE FreeRTOS操作教程(五):mutex互斥信号量 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&am…

蓝牙技术|详谈蓝牙信道探测技术,可实现厘米级精准定位

2024年9月5日,蓝牙技术联盟发布蓝牙6.0核心规范。相比此前各版本,蓝牙核心规范6.0版的主要创新和新功能包括:支持蓝牙信道探测、同步适配层增强、LL扩展功能和 帧空间更新。 蓝牙信道探测 市场上已经有不少高精度定位技术了,像 …

ToF传感器更新

我们最近改进了 ToF 解码管道(固件)和 ToF 工厂校准,该校准已应用于我们最新的带有 ToF 相机的OAK-D-SR-PoE 1. 点云 这是直接来自摄像机的原始点云(没有应用任何后处理过滤器)。 2. ToF 精度 (ToF 深度误差…

界面控件Telerik UI for WinForms 2024 Q3概览 - 支持合并单元格等

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 本文将介绍界面组件Telerik UI for WinForms在今年第一…

3d可视化图片:通过原图和深度图实现

1、depthy 在线体验demo: https://depthy.stamina.pl/#/ 也可以docker安装上面服务: docker run --rm -t -i -p 9000:9000 ndahlquist/depthy http://localhost:90001)首先传原图 2)再传对应深度图 3)效果 </ifra

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

分布式系统的概念与设计模式

概念 定义&#xff1a;分布式系统是指将数据和计算任务分散到多个独立的计算机上&#xff0c;这些计算机通过网络进行通信和协作&#xff0c;共同对外提供服务。分布式系统不仅提高了系统的可靠性和可扩展性&#xff0c;还增强了系统的并发处理能力和数据管理能力。 特点&…

【操作系统强化】王道强化一轮笔记

第一章 计算机系统概述 考点1 操作系统的概念、特征和功能 1. 2. 考点2 内核态与用户态 1. 2.用户态和内核态之间的切换本质上就是应用程序和操作系统对CPU控制器的切换 考点3 中断和异常 1. 2. 考点4 系统调用 1. 2. 3.C 考点5 操作系统引导 1. 2. ①磁盘的物理格式化&…

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …