量化InnoDB group commit的效果

前几天有位开发的同学问了个问题,InnoDB的group commit效果如何?之前说好了回头给看下,结果险些拖过年。

Group commit背景
         InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit)。如果设置为1,每次事务提交都至少需要写一次redolog。这对IOPS冲击严重,尤其是在HDD上,直接成为性能瓶颈。
         Group commit的基本想法是将多个并发线程对redo的fsync操作合并成1个。具体的过程可以参照这篇。

Group commit的效果

         其实效果好不好全看具体场景。这里我们先给出一种直观看结果的方法,然后再举例子分析。

1)       数据
         简单表结构
CREATE TABLE `tb` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

并执行(伪码,大家看得懂的)
For(i=1; i<=100; i++)
    insert into tb ($i, 1)

2)       观察脚本
后续我们启不同类似的压力,先给出观察脚本。神器systemtap

cat innodb_group_commit.stp   
/*
   this script is for investigatint the effect of InnoDB group commit
 */
global n_log_write
global n_flush
global n_prev_flush
probe process(“/u01/dingqi.lxb/mysql56/bin/mysqld”).function(“log_write_up_to”)
{
  if ($wait == 92)
    n_log_write += 1;
}
probe process(“/u01/dingqi.lxb/mysql56/bin/mysqld”).function(“fil_flush”)
{
  n_flush= $fil_n_log_flushes;
}

probe timer.s(1)
{
  if (n_log_write)
  {
    printf(“n_write %d n_flush %d\n”, n_log_write, n_flush – n_prev_flush);
    n_prev_flush = n_flush;
    n_log_write = 0;
  }
}

probe begin
{
  println(“Ready”);
}

3)       压力

a)       单线程压力
我们先单线程执行update tb set c=c+1 where id=1次,看输出

可以看到n_write和flush的比例为1:1.
因为单线程就无所谓”group” 了

b)       并发线程压力
启50个客户端线程,每个都单独持续执行 update tb set c=c+1 where id=1


 还是1:1, 原因? InnoDB里的行锁导致每个更新事务都互相阻塞,也就是说在commit阶段是串行的,也没有group。与a的区别仅仅是TPS稍微高了一点。

 c)       并发更新
启动50个线程,线k执行 update tb set c=c+1 where id=k

现在能看出效果了,差不多是3:1.
另外顺便提下, 多线程更新同一行的性能真是太低了。(商品热卖?)

d)       100并发更新

与c类似,启动100个线程,线k执行 update tb set c=c+1 where id=k
差不多是5:1,并发越多就有越大的概率用到组提交。

 

 PS
        细心的同学从上面的脚本中可以看到,变量 fil_n_log_flushes 记录的就是redo 的fsync次数,这个值表示redolog做了多少次sync 。可以从这个命令得到
show global status like ‘Innodb_os_log_fsyncs’;

 

 PS_final
         实际上如果在log_write_up_to入口增加一个变量统计,就能直接从show status里面得到脚本输出的这两个值,观察更方便

 

PS_final_final
         实际单线程压力下,n_write和n_flush并非严格的1:1,但在持续压力下可以近似。比如我们压1万次, n_flush会多出6次。那是后台线程在刷,可以忽略。

 

 PS_final_final
        说个吉祥话吧,祝所有DBA同学们2013年 线上无报警,节假不加班 呀。

磁盘读写时间拆解:寻道/旋转/传输3阶段延迟分析与优化实战 本文深入解析机械硬盘(HDD)读写性能优化的三大关键延迟因素:寻道时间、旋转延迟和传输时间,并提供详细的量化分析模型与实战优化策略。从操作系统级调度算法、文件系统配置到数据库专项调优,全面覆盖磁盘性能提升方案,帮助开发者应对高I/O负载场景。 阅读详情

相关推荐

MySQL实战导航图:从语法执行者到机制理解者

MySQL不是SQL语法的简单集合,而是以存储引擎为核心、由查询优化器、事务系统、锁机制与日志体系协同运作的关系型数据库系统。理解其底层原理——如InnoDB的B+树索引结构、MVCC多版本并发控制、next-key lock加锁逻辑及ROW格式binlog的数据一致性保障机制——才能真正规避慢查询、死锁与主从延迟等高频故障。本文聚焦真实业务场景(如用户行为分析、库存扣减、实时报表),将CREATE TABLE、SELECT执行计划、事务控制、在线DDL等关键语法,锚定在数据写入、查询优化、一致性保障与运维

cm333666的博客 385

【MySQL技术内幕】49-事务的实现之group commit

该参数的默认值为0,且推荐设置依然为0。但当有事务进行这个过程时,其他事务可以进行步骤1)的操作,正在提交的事物完成提交操作后,再次进行步骤2)时,可以将多个事务的重做日志通过一次fsync刷新到磁盘,这样就大大地减少了磁盘的压力,从而提高了数据库的整体性能。代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等。

smart_an的专栏 1007

MySQL数据库

MySQL 基础知识点摘要 查询语句区别 WHERE vs HAVING:WHERE在分组前过滤行,不能直接使用聚合函数;HAVING在分组后过滤分组数据,可使用聚合函数 UNION vs UNION ALL:UNION自动去重但性能较慢,UNION ALL保留所有记录且性能更快 IN vs EXISTS:IN先执行子查询再匹配,适合主查询结果集大;EXISTS主查询每行执行子查询,适合主查询结果集小 数据操作区别 DELETE:删除指定行,记录日志,不重置自增ID,空间标记为可重用 TRUNCATE:清空

weixin_54017681的博客 382

InnoDB(7.3):事务——purge操作与group commit

Purgepurge实现清理undo页purge的相关参数group commit拓展:InnoDB1.2版本之前,group commit的不足BLGCBLGC的实现步骤 前面提到过,事务的delte和update操作是不直接删除原有数据的,都是采用标记删除,即在undo log页标记为删除,但在实际的B+树索引还是有该记录的,真正删除这行记录的操作其实被时延了,最终是在Purge操作中完成的 Purge purge操作其实是为了支持MySQL的MVCC,所以记录不能在事务提交时就立即进行处理,因为可能.

GDUT_Trim的博客 668

MySQL 8.0 与 PostgreSQL 15 性能对比:3种典型场景下的 TPS 与延迟实测

本文对比了MySQL 8.0与PostgreSQL 15在OLTP点查、批量写入和复杂JOIN查询三种典型场景下的性能表现,包括TPS与延迟实测数据。测试结果显示,MySQL在高频率简单查询中表现更优,而PostgreSQL在复杂分析和批量数据加载场景下更具优势。为数据库技术选型提供了量化依据。

weixin_34082789的博客 339

SQL与NoSQL选型实战:从数据契约出发的五维决策法

数据库选型本质是数据管理策略的设计,核心在于理解数据的读写特征、一致性要求与演化规律。SQL代表强一致性、事务保障与结构化查询能力,适用于金融交易、电商库存等ACID刚性场景;NoSQL则以BASE理论为基,通过基本可用、软状态和最终一致性换取高吞吐、弹性扩展与Schema灵活演进,适配IoT日志、用户行为分析等海量写入场景。二者并非对立技术栈,而是面向不同数据契约的服务承诺。本文基于真实生产案例,提炼出写入模式、查询复杂度、Schema变更频率、扩展路径与运维成熟度五大可量化维度,帮助工程师摆脱‘MySQ

weixin_33910137的博客 473

mysql group commit_量化InnoDB group commit的效果

前几天有位开发的同学问了个问题,InnoDB的group commit效果如何?之前说好了回头给看下,结果险些拖过年。Group commit背景InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit)。如果设置为1,每次事务提交都至少需要写一次redolog。这对IOPS冲击严重,尤其是在HDD上,直接成为性能瓶颈。Group com...

weixin_39677106的博客 133

Ubuntu 13.04 + Nginx + Drupal 7 高性能部署实战

LEMP 栈(Linux、Nginx、MySQL、PHP)是轻量级 Web 应用的经典部署范式,其核心在于 Nginx 的事件驱动模型与 PHP-FPM 进程池的协同优化,显著降低内存开销与上下文切换成本。相比 Apache 的多进程 PHP 加载模式,Nginx 仅处理 HTTP 协议与静态资源,将动态请求交由独立、可调优的 PHP-FPM 池执行,实现资源按需分配与故障隔离。该架构特别适用于内存受限的 VPS 环境,能有效支撑 Drupal 7 这类模块化深度高、缓存与权限逻辑复杂的 CMS。本文基于

weixin_34341117的博客 443

innodb的group commit的小结

浏览了group commit的几篇文章,尤其是一个老外的4篇blog,对innodb的group commit的前因后果有了一个较清晰的了解。 起因: 硬盘IO次数是有限的,是数据库性能的瓶颈。数据库为了持久性,必须把事务所做的修改flush到硬盘上,最后需要调用fsync()来完成一个IO,所以速度很慢。这样,在并发环境下,事务都会排队等在最后一步。于是为了节省硬盘IO,可以把几次IO合并

jdr0212的专栏 1012

高并发抢标系统瓶颈诊断与实战优化指南

高并发场景下的Web系统稳定性,本质是流量洪峰对计算、存储与网络资源的极限压测。其核心原理在于请求链路中任一环节(如Apache连接池、MySQL主库单点、无读写分离架构)出现容量失衡,即触发级联雪崩。技术价值体现在将模糊的‘页面打不开’转化为可量化的连接数、QPS、锁等待时间等指标,并通过参数调优、读写分离、缓存降载等工程手段实现确定性扩容。典型应用场景包括金融加息券抢购、电商秒杀、在线教育抢课等瞬时高并发业务。本文基于真实抢标故障复盘,深入Apache MaxRequestWorkers配置陷阱与MyS

a6t2007的博客 392

无符号整数、带符号整数溢出问题

让我们详细讲解一下带符号整数溢出和无符号整数溢出问题中,符号标志位 (SF)、零标志位 (ZF) 和进位标志位 (CF) 的行为方式

weixin_49342084的博客 2090

MySQL Group Commit理解

简单的方法理解MySQL Group Commit原理 一个摆渡将乘客从A点传输到B点 MySQL 5.0 行为 在MySQL 5.0中,摆渡会在A点按顺序搭载乘客,并且传送到B点。A点和B点的来回行程大约需要10min时间,因此在摆渡过程中一些乘客已经到达A点。这样,在摆渡返回A点后,只会按顺序搭载下一个乘客,其他的都在排队等待中。 MySQL 5.6 行为 在

Simple Life 1875

深入解析:如何基于开源OpENer开发EtherNet/IP从站服务

通过OpENer开源库,开发者可以快速实现符合ODVA规范的EtherNet/IP从站设备,降低开发成本并提高系统灵活性。本文详细介绍了EtherNet/IP协议原理、OpENer库的特点与优缺点,以及二次开发的完整流程。通过遵循本文提供的指南,开发者可以成功构建出工业级的EtherNet/IP通信设备。

极地星辰 3007

MySQL 写入放大(Write Amplification)的庖丁解牛

写入放大是 InnoDB 为 ACID 付出的必要代价,但可优化。核心矛盾可靠性(多写) vs 性能(少写)优化优先级1. 批量操作 → 2. 调整日志 → 3. 硬件升级终极原则“不要试图消除写入放大,而要将其控制在可接受范围”。💡一句话MySQL 的写入放大,是数据安全的保险费——付多少,取决于你对风险的容忍度。

长风破浪会有时的博客 742

植物叶绿体基因组分析全攻略:从共线性到密码子偏好性

本文全面解析植物叶绿体基因组分析流程,从共线性分析到密码子偏好性研究。详细介绍了叶绿体基因组结构特征、测序数据获取与质量控制、基因组组装与注释方法,以及比较基因组学和进化分析技术。特别关注IR区边界变异分析和选择压力评估,为植物系统发育研究和物种鉴定提供实用指南。

weixin_28475533的博客 222

冒泡排序的并行计算

本人也是并行计算的小白,在这里记录下自己的学习笔记。 今天做了一下冒泡排序的并行计算比较: 串行冒泡排序如下: #include <stdio.h> #include <stdlib.h> #include <windows.h> void BubbleSort(int * pData, int nSize) { if (!pData) { ...

gaoyi的专栏 4492

【Python量化实战 #17】数据存哪里不卡?Python股票存储方案CSV-SQLite-MySQL对比与选型

存储方案没有"最好的",只有"最适合的"。小项目 / 单人→ SQLite 是最优解(快、稳、零依赖、随项目走)多人协作 / Web 后端→ MySQL,DDL 直接复用本文模板临时分析→ CSV,Excel 可读就行归档→ Parquet,省盘工程化模块继续推进:下一篇把存下来的数据画成 K 线图——pyecharts 交互式看板 + matplotlib 静态图,让回测结果有"看得见"的形态。在线体验更多接口:https://mairuiapi.com/playground。

2501_94338261的博客 204

新疆地形数据下载:30米、12.5米、5米DEM地形数据

新疆是我国陆地面积最大的省级行政区,总面积达166万平方公里。新疆的地形也十分的复杂,新疆的地形呈山脉与盆地相间排列,盆地被高山环抱,,俗称“三山夹两盆”。三山指阿尔泰山、昆仑山、天山,两盆是指塔里木盆地和准噶尔盆地。 对精度要求不高的话,可以直接使用图新地球下载 新疆30米地形数据 大小:9.26GB 来自ASTER v3的新疆30米地形数据 30米地形数据下载 新疆12.5米地形数据 12.5米DEM数据由于精度比较高,一般不会用到全省的数据,通常用的是一个地区的,因此,可以单独分

LocaSpace的博客 3495

重新认识MySQL

服务层:负责 SQL 的解析、优化、逻辑执行(过滤、分组、排序、连接等)。存储引擎层:负责数据的物理读取、索引操作、事务和锁管理。数据文件:存储原始数据,由存储引擎直接操作。这种分层架构让 MySQL 具有良好的灵活性,用户可以根据需求选择不同的存储引擎(如 InnoDB 用于事务,MyISAM 用于读密集场景),而服务层的逻辑保持统一。引擎层:会尽可能利用索引或全表扫描中的实时判断,对id > 100这类条件进行过滤,返回的是初步过滤后的数据。服务层。

AlbenXie的博客 725

03 Token、Embedding、上下文窗口:开发者必须懂的三个基本概念

Token、Embedding 和上下文窗口是大模型应用开发的三个基础概念。本文从成本、速度、检索和上下文设计四个角度讲清它们的工程意义,帮助开发者理解为什么同一段内容会超限、变贵,为什么 RAG 能做语义检索。

老于的笔记的专栏 411

损失函数大汇总(三十八)(AUCPR Loss附公式推导与代码)

本文系统介绍了AUCPR Loss的原理与应用。针对不平衡分类任务中AUC指标不够敏感的问题,提出通过优化PR曲线面积(AUCPR)来提升模型性能。文章详细推导了AUCPR的可微近似实现:首先用sigmoid函数软化阈值判断,构造可微的TP/FP/FN计数;然后基于软Precision和Recall计算近似PR曲线面积;最后通过数值积分得到可优化的损失函数。特别讨论了温度参数τ对训练稳定性的影响,并比较了AUCPR与AUC、AP等指标的异同。该方法适用于医学筛查、欺诈检测等极端不平衡场景,能更准确反映模型对

悦学共鸣,温柔以待,汇聚光芒,共同成长 441

GLM-5-Code-Engine:面向工程落地的开源代码推理栈

大模型写代码已从语法补全迈向工程级生成——其核心在于对编程语言结构(AST)、项目上下文(Git/Confluence/Jira)和团队规范(安全策略/编码约定)的深度建模。GLM-5-Code-Engine并非单纯开源权重,而是融合符号缓存(symbol-cache)、多源上下文图谱(MSCI)与三层校验(SGOV)的可部署推理框架,显著提升首次生成通过率与生产就绪度。它适用于中高级工程师在Spring Boot、微服务重构、遗留系统适配等真实场景中的高信噪比代码生成与决策辅助,标志着AI编程正从‘工具增

cqwmy840702的博客 571

三维重建(十三)——多视角重建

本文综述了多视角三维重建技术,涵盖静态和动态场景的重建方法。介绍了从图像获取到纹理映射的SFM流程,以及非刚性重建(NRSFM)的挑战和解决方案。重点探讨了基于可微渲染的重建方法,以及数据采集策略、相机标定和同步技术。文章还讨论了如何用单视角相机模拟多视角重建,总结了关键技术和未来研究方向。

河海大学研究生在读的学习笔记 1058

Data-driven微服务测试:数据流全链路验证四维模型

Data-driven微服务并非简单接入数据库,而是业务逻辑、路由策略与服务状态均由实时数据流动态驱动。其核心挑战在于数据在多源、多存、多时序环境下的完整性、一致性、时效性与韧性。传统单元测试与Mock方案因无法复现生产级数据语义(如Binlog解析差异、Kafka乱序消费、Redis-Mysql最终一致窗口)而大面积失效。本文聚焦数据生命周期全链路验证,提出覆盖数据接入完整性、跨存储状态一致性、流式处理时效鲁棒性及脏数据质量韧性的四维验证模型,并提供可落地的沙箱构建、Diff比对、混沌注入与SLO绑定实践

weixin_30570101的博客 404

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机面试例题搜集(更新)

MySQL的逻辑架构从上到下分为四层。最上面是连接层,负责处理客户端的连接请求,包括TCP握手、用户名密码认证、权限校验,以及维护连接线程。连接池就在这里,每个客户端连接会分配一个独立线程,线程会缓存起来复用,减少频繁创建销毁的开销。连接层还会做安全检查,比如SSL连接加密。第二层是服务层,这是MySQL的核心功能层。它包含SQL接口模块,接收SQL语句并返回结果;查询解析器会把SQL解析成解析树,检查语法和语义是否正确;查询优化器会根据成本模型选择最优执行计划,比如决定用哪个索引、join顺序怎么排;还有

2301_81704123的博客 434

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MySQL面试高频题实战拆解:从索引到事务优化

数据库性能优化是后端开发的核心能力,而MySQL作为最常用的关系型数据库,其索引、事务、日志与SQL优化机制一直是技术面试的高频考点。理解B+树为何能支撑千万级数据的高效查询,掌握MVCC如何在可重复读隔离级别下实现快照读,以及redo log与binlog如何通过两阶段提交保证主从一致,是区分“背诵者”与“实战者”的关键。本文从存储引擎的底层原理出发,结合EXPLAIN执行计划分析慢查询的优化路径,并给出深分页处理、索引失效场景等工程实践案例,帮助开发者在面试中展现出真正的生产经验。

weixin_30487201的博客 345
上一篇: 5.6 explain update一个疑似bug
下一篇: [MySQL 版本差异] 丢失frm文件之后drop database的不同结果分析
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值