当前位置:首页 > AI技术 > 正文内容

mysql如何提升InnoDB写入 对比MyISAM的写入锁机制实战案例|Duuu笔记

admin4个月前 (04-01)AI技术87

InnoDB写入慢主因非引擎本身,而是autocommit=1、redo刷盘频繁、未批量提交、主键无序等配置与设计问题;优化需关自动提交、用显式事务、调大缓冲池、改主键为自增、禁用校验、配合LOAD DATA及调整innodb_flush_log_at_trx_commit。

为什么InnoDB写入比MyISAM慢,不是因为“引擎不行”

InnoDB默认走事务+行锁+缓冲池+redo日志这一整套机制,MyISAM是纯表级锁+直接刷磁盘。看起来MyISAM“更轻”,但慢的根源往往不在引擎本身,而在你没关掉它本不该开的开关。比如

autocommit=1

下每条

INSERT

都隐式开启又提交一次事务,redo日志强制刷盘(

innodb_flush_log_at_trx_commit=1

),再加上没批量、没索引预热、主键不连续——这些加起来,比引擎选型影响大得多。

常见错误现象:

SHOW PROCESSLIST

里一堆

updating

卡住,

INFORMATION_SCHEMA.INNODB_TRX

显示长事务堆积,磁盘

iowait

高但CPU空转。

确认是否真在用InnoDB:

SHOW CREATE TABLE t1

ENGINE=InnoDB

,别被建表语句里漏写的

ENGINE

误导

检查

autocommit

状态:

SELECT @@autocommit

,批量写入前设为

0

,自己控制

COMMIT

时机

避免单条

INSERT ... VALUES (...), (...), (...)

当多条用——MySQL解析器会拆成多语句,仍触发多次日志刷盘

批量插入必须绕开自动提交和唯一性校验

真正起效的批量写入,不是靠“多插几行”,而是让InnoDB把多行压进一个事务、一批redo记录、一次缓冲池合并。MyISAM的“快”本质是跳过了所有这些保障,所以对比时得先拉到同一安全基线再谈优化。

使用场景:导入CSV、ETL落库、日志归档等非实时强一致场景。

显式事务封装:

BEGIN; INSERT INTO t VALUES (...),(...),(...); COMMIT;

,单次

COMMIT

触发一次redo刷盘

关闭唯一键/外键检查(仅限导入可信数据):

SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;

,导入完再开

调大

innodb_buffer_pool_size

(建议设为物理内存50%~75%),避免频繁刷脏页挤占写入带宽

LOAD DATA INFILE

代替

INSERT

——它跳过SQL解析层,直通存储引擎,速度通常快5~10倍

innodb_flush_log_at_trx_commit

不是“越稳越好”

这个参数决定事务提交时redo日志怎么刷盘:

1

(每次commit都fsync到磁盘,最安全)、

0

(每秒刷一次,崩溃最多丢1秒数据)、

2

(写入os cache就返回,但崩溃后os crash可能丢数据)。线上业务常设为

1

,但批量导入时设成

0

2

能直接提升3~5倍写入吞吐。

性能影响:从

1

0

,磁盘IOPS压力骤降,

INSERT

延迟从毫秒级降到微秒级;但代价是事务持久性下降——只要

mysql

d进程没挂,

0

2

都能保数据;一旦服务器断电,

0

可能丢整个秒级批次。

白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载

临时调整(会话级):

SET SESSION innodb_flush_log_at_trx_commit = 0;

不要全局改

my.cnf

长期设为

0

,除非你清楚承担丢失最近1秒事务的风险

sync_binlog

要和它配合:若binlog也设为

0

,主从数据一致性风险叠加

主键设计不当会让InnoDB写入退化成“随机写”

InnoDB按主键顺序组织数据(聚簇索引),如果主键是

AUTO_INCREMENT

整数,新行总追加在B+树最右端,写入就是顺序IO;但如果主键是

UUID

MD5

或时间倒序

created_at

,每次插入都要定位到树中间甚至左侧页,引发大量页分裂、缓冲池淘汰、磁盘随机写——这时哪怕关了日志刷盘也没用。

容易踩的坑:用

CHAR(32)

存UUID当主键,或用

created_at DESC

做联合主键首字段。

优先用

BIGINT AUTO_INCREMENT

作主键,业务字段放普通索引

非要用UUID,考虑用

UUID_TO_BIN()

+

REVERSE()

变换成时间前置格式(MySQL 8.0+支持)

避免在写密集表上建太多二级索引——每写一行,所有二级索引都要更新,B+树分裂成本翻倍

InnoDB写入性能的瓶颈很少卡死在引擎层,更多卡在配置误用、主键乱序、事务粒度太碎这些地方。调参只是表象,真正要盯住的是“这一批写入,到底触发了多少次磁盘IO、多少次B+树分裂、多少次锁等待”。

相关文章

【大模型应用开发

二、大模型的泛化与微调 模型的泛化能力:是指一个模型在面对新的、未见过的数据时,能够正确理解和预测这些数据的能力。在机器学习和人工智能领域,模型的泛化能力是评估模型性能的重要指标之一。...

【DL】2023年你应该知道的 10 大深度学习算法

3. 循环神经网络 (RNN) 4. 生成对抗网络 (GAN) 5. 径向基函数网络 (RBFN) 6. 多层感知器 (MLP) 7. 自组织图 (SOM)...

神经网络分类总结

从网络性能角度可分为连续型与离散型网络、确定性与随机性网络。 从网络结构角度可为前向网络与反馈网络。 从学习方式角度可分为有导师学习网络和无导师学习网络。 按连续突触性...

推荐10个AI人工智能技术网站

除了研究和开发人工智能技术,OpenAI还积极参与人工智能伦理和安全的研究和探讨。 认为,人工智能技术的发展必须遵循伦理和法律的规范,以确保人工智能的应用不会对人类带来负面影响。...

一文讲清神经网络、BP神经网络、深度学习的关系

人工神经网络中的顶级代表。往往说《神经网络》就是指《BP神经网络》。 大家研究着各种神经网络,研究得不亦乐乎, 来了两个家伙Romelhart 和Mcclelland,...

前端开发高级应用:MuleRun如何连接Slack通知 MuleRun消息推送集成配置步骤实战案例|Duuu笔记

若MuleRun无法向Slack推送通知,需依次配置Incoming Webhook或Bot Token、在MuleRun中设置对应通知目标参数,并通过最小化任务测试验证;常见失败原因包括凭据错误、权...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。