提高mysql插入速度的方法

导读

作者:杨漆
16年关系型数据库管理,从oracle 9i 、10g、11g、12c到Mysql5.5、5.6、5.7、8.0 到TiDB获得3个OCP、2个OCM;运维路上不平坦,跌过不少坑、熬过许多夜。把工作笔记整理出来分享给大伙儿,希望帮到大家少走弯路、少熬夜。

干货:

一般情况下mysql在百万级数据时读取、插入、更新速度较快,客户体验良好,但到了两千万级以上就会出现很慢

解决案例:将MySQL插入速度从2000条/分钟 提高到 12000条/秒。

核心思想:

1、尽量使数据库一次性写入Data File

2、减少数据库的checkpoint次数

3、程序上尽量缓冲数据,进行批量式插入与提交

4、减少系统的IO冲突

  1. innodb_flush_log_at_trx_commit 配置设定为0 (插入速度会有很大提高,但Sever断电时有丢失数据风险)

  2. innodb_autoextend_increment 从8M修改为256M (减少tablespace自动扩展次数,避免频繁自动扩展Data File导致 MySQL 的checkpoint 操作)

  3. innodb_log_buffer_size 从8M修改为16M (根据1秒钟内的事务量情况 适度增大,太大会浪费,因为每1秒钟总会flush一次)

  4. innodb_log_file_size 从8M修改为256M (根据服务器内存大小与具体情况设置适合自己环境的值)

  5. innodb_log_files_in_group 从2修改为8 (增加Log File数量。此修改主要满足第1、2点)

  6. innodb_file_per_table=on & alter table table_name engine=innodb 将大表转变为独立表空并且进行分区,然后将不同分区下挂在多个不同硬盘阵列中,分散IO

  7. innodb_write_io_threads & innodb_read_io_threads 从4修改为64 (根据自己的Server CPU核数来更改相应的参数值)

  8. innodb_io_capacity & innodb_io_capacity_max 从200修改为10000 (提升 innodb刷脏页的能力,根据自己的的存储IOPS进行对应调整)

获取测试结果:

Query OK, 3840000 rows affected (5 min 20.11 sec)

Records: 3840000 Duplicates: 0 Warnings: 0

Query OK, 3840000 rows affected (6 min 47.28 sec)

Records: 3840000 Duplicates: 0 Warnings: 0

Query OK, 3840000 rows affected (7 min 36.11 sec)

Records: 3840000 Duplicates: 0 Warnings: 0

Query OK, 3840000 rows affected (7 min 59.21 sec)

Records: 3840000 Duplicates: 0 Warnings: 0

结果:完成了以上修改操作后;384万行数据的插入速度从30小时缩减到了5分20秒,效率得到极大的提升!

你可能感兴趣的:(mysql,数据库,运维)