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

mysql性能优化中存储引擎的选择 合理配置InnoDB参数|Duuu笔记

admin7个月前 (04-04)AI技术178

面向高级开发者的数据库指南,涵盖

InnoDB是MySQL默认引擎因其高并发写入、事务支持和行级锁能力,但非万能:日志表用MyISAM/ARCHIVE更省空间,只读宽表宜选ColumnStore或压缩InnoDB;MVCC清理不及时或误设引擎会导致Rows不准、Data_length膨胀;redo日志配置不当会拖慢写入;主库必须设innodb_flush_log_at_trx_commit=1保障持久性。

为什么 InnoDB 是 MySQL 默认引擎,但不是所有场景都该用它

InnoDB 能扛住高并发写入、支持事务和行级锁,所以默认启用——但这不等于它适合所有表。比如日志类

INSERT

频繁但几乎不查的表,用

MyISAM

或

ARCHIVE

可能更省空间、更快;又比如只读报表库里的宽表,

ColumnStore

(通过 MariaDB)或分区 +

innodb_file_per_table=OFF

配合压缩反而更稳。

常见错误现象:

SHOW TABLE STATUS

里看到

Rows

严重不准,且

Data_length

比实际数据大几倍——大概率是

InnoDB

的 MVCC 版本链没及时清理,或是

MyISAM

表被误设为

InnoDB

后长期不做

OPTIMIZE TABLE

。

判断依据优先看访问模式:有没有事务?是否需要崩溃恢复?是否频繁

UPDATE/DELETE

?

READ ONLY

场景下,可考虑

innodb_read_only=ON

,减少 redo 日志写入开销

小表(MyISAM 的

INSERT

吞吐有时比

InnoDB

高 2–3 倍

innodb_buffer_pool_size 设多大才不翻车

它不是越大越好,也不是“内存一半”这种经验公式能通用的。核心原则是:留足系统缓存、连接线程、临时表、排序缓冲的空间。Linux 下若

innodb_buffer_pool_size

占满物理内存,

mysqld

进程可能被 OOM killer 干掉。

使用场景差异明显:OLTP 系统倾向 70–80% 内存;数据仓库类(大查询+临时表多)建议压到 50–60%,否则

sort_buffer_size

和

tmp_table_size

会抢不到内存。

检查真实压力:

SHOW ENGINE INNODB STATUS\G

中关注

Buffer pool hit rate

,持续低于 99% 才真需要调大

动态调整需注意:

SET GLOBAL innodb_buffer_pool_size = ...

要求 MySQL ≥ 5.7.5,且必须是 128MB 对齐(否则报错

Invalid argument

)

重启生效时,首次启动加载热数据慢,监控

Innodb_buffer_pool_load_status

确认预热进度

innodb_log_file_size 太小会导致频繁刷盘

redo log 不是越大越安全,而是要匹配你的峰值

UPDATE/INSERT

量。太小(如默认 48MB)会让 InnoDB 频繁 checkpoint,触发大量随机写,磁盘

iowait

拉高;太大(如 >2GB)则 crash recovery 时间变长,影响可用性。

典型错误现象:

SHOW ENGINE INNODB STATUS

中

Log sequence number

和

Last checkpoint at

差值长期接近

innodb_log_file_size × innodb_log_files_in_group

,说明 redo 循环太快,正在拖慢写入。

估算方法:观察 1 小时内

Innodb_os_log_written

增量,取峰值 10 分钟值 × 2,即为合理

innodb_log_file_size

修改流程必须停机:

SET GLOBAL innodb_fast_shutdown=0

→ 关库 → 删除旧

ib_logfile*

→ 修改配置 → 启动(否则报错

log file size mismatch

)

SSD 上可适当放宽上限(如 512MB),但 HDD 上不建议超 256MB

innodb_flush_log_at_trx_commit=2 在主库上很危险

设成 2 表示事务提交时只写 OS cache,不

fsync

到磁盘——性能确实提升明显,但机器断电或内核 panic 时,最多丢失 1 秒事务。这在从库或测试环境可以接受,但在主库上等于主动放弃 ACID 中的 Durability。

容易被忽略的连锁反应:

innodb_flush_log_at_trx_commit=2

+

sync_binlog=0

组合,会让主从数据一致性彻底不可控;而如果 binlog 开了

sync_binlog=1

,但 InnoDB 不同步 redo,则 crash 后可能 binlog 有记录、InnoDB 数据没落盘,导致主从复制中断并报错

Could not find first log file name in binary log index file

。

生产主库唯一安全值是

1

;从库可根据延迟容忍度选

0

或

2

云数据库(如 RDS)通常强制锁定该参数,改不了——别白费力气找地方配

配合

innodb_doublewrite=ON

(默认开启),才能避免部分页写入失败导致的表损坏

真正卡住性能的,往往不是单个参数调得不够狠,而是 buffer pool、log size、刷盘策略之间互相牵制。改一个之前,先用

mysqladmin extended-status -r -i 1 | grep -E "Innodb_buffer_pool|Innodb_log|Innodb_os_log"

看 30 秒真实波动,比拍脑袋设值靠谱得多。

相关文章

【大数据分析 | 深度学习】在Hadoop上实现分布式深度学习

一、Submarine(Hadoop生态系统) (一)Submarine 介绍 (三)Submarine 属于 Hadoop 生态系统 (四)Submarine 官网版...

LLM介绍

。LLM 被证明在使用指令形式化描述的未见过的任务上表现良好。这意味着 LLM 能够根据任务指令执行任务,而无需事先见过具体示例,展示了其强大的泛化能力。 :小型语言模型通常难以解决涉...

Unity 机器学习 基础

ML-Agents 资产导入 Unity 场景创建 Unity 代码部分 Anaconda 执行 rollerball_config.yaml 机器学习逻辑处理...

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

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

神经网络分类总结

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

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

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

发表评论

访客

看不清,换一张

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