MySQL 5.7.12升级至8.0.26后批量插入性能下降需调整哪些配置参数
MySQL 8.0.26 批量插入性能优化配置方案
1. 连接字符串调整
首先补全8.0连接字符串的SSL关闭参数,与5.7配置对齐:
server=localhost;user id = root; password=xxxx;persistsecurityinfo=True;database={0};Sslmode=none;defaultcommandtimeout=300;connectiontimeout=10;maxpoolsize=150
MySQL 8.0默认启用SSL连接加密,本地回环连接无需SSL,加密逻辑会产生额外CPU开销,关闭后性能可提升20%~40%,是本次版本升级后性能下降的首要排查点。
2. 服务端配置参数调整
在现有通用配置基础上,新增/修改以下参数:
- 调整
innodb_buffer_pool_size为8G11G(物理内存的50%70%),当前2G配置远低于16G内存的合理值,增大缓冲池可大幅减少磁盘IO次数,提升批量写入效率 - 新增配置
innodb_log_buffer_size = 128M,增大事务日志缓存,减少日志刷盘频率 - 若使用机械硬盘,新增配置
innodb_flush_neighbors = 1,开启相邻页刷新机制,减少机械盘寻道开销;若为SSD磁盘保持默认0即可 - 临时关闭双写缓冲:
innodb_doublewrite = 0,可降低近一半的写入开销,批量插入完成后可按需恢复开启(当前innodb_flush_log_at_trx_commit=0已无强事务一致性要求,关闭双写无额外风险) - 调大
max_allowed_packet = 64M,适配大批次批量插入的单SQL体积要求 - 保持字符集、排序规则与5.7版本完全一致,避免8.0默认的
utf8mb4_0900_ai_ci排序规则带来的额外字符校验开销 - 若无需主从同步,批量插入期间临时关闭二进制日志:
skip-log-bin,减少日志写入开销
3. 批量插入逻辑优化
- 插入前临时删除
activity_info表的非主键索引、唯一索引,全量数据插入完成后再重建索引,可减少90%以上的索引维护开销 - 单条
INSERT语句的VALUES批次控制在1000~3000条,避免单SQL过大导致的解析、执行开销 - 每5~10条批量INSERT执行一次事务提交,减少事务提交的刷盘次数
内容的提问来源于stack exchange,提问作者Rahul Singh
相关产品推荐
相关产品推荐

