mysql 大量数据插入优化
Posted code_____monkey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 大量数据插入优化相关的知识,希望对你有一定的参考价值。
1、一条SQL语句插入多条数据
修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因是: (1)通过合并SQL语句,同时也能减少SQL语句解析的次数,减少了数据库连接的I/O开销,一般会把多条数据插入放在一条SQL语句中一次执行; (2)合并后日志量(mysql的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。
批量插入如果数据量太大可能出现下面的情况:
MySQL报错:Packets larger than max_allowed_packet are not allowed (通过修改max_allowed_packet的值来解决,show VARIABLES like '%max_allowed_packet%';)
2、在事务中进行插入处理。
START TRANSACTION;
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);
...
COMMIT;
使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作
。
注意事项:
-
SQL语句是有长度限制
,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。 -
事务需要控制大小
,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。
4、关闭binlog、general-log
5、其他参数
bulk_insert_buffer_size=100M
innodb_flush_log_at_trx_commit=2; #禁止时时同步日志到磁盘
8. 将 innodb_autoextend_increment 配置由于默认8M 调整到 128M innodb_autoextend_increment=128
此配置项作用主要是当tablespace 空间已经满了后,需要MySQL系统需要自动扩展多少空间,每次tablespace 扩展都会让各个SQL 处于等待状态。增加自动扩展Size可以减少tablespace自动扩展次数。
9.将 innodb_log_buffer_size 配置由于默认1M 调整到 128M innodb_log_buffer_size=128M
此配置项作用设定innodb 数据库引擎写日志缓存区;将此缓存段增大可以减少数据库写数据文件次数。
10.将 innodb_log_file_size 配置由于默认 8M 调整到 128M innodb_log_file_size=128M
此配置项作用设定innodb 数据库引擎UNDO日志的大小;从而减少数据库checkpoint操作。
max_allowed_packet=1073741824
bulk_insert_buffer_size=100M
innodb_log_buffer_size=128M
innodb_log_file_size=128M
innodb_autoextend_increment=100
innodb_flush_method=O_DIRECT
innodb_io_capacity=2000
innodb_io_capacity_max=20000
innodb_flush_log_at_trx_commit=2
6、结合机器情况
2 cpu 8g 内存。进程数设置为 2 分页每页 100000 条,调大 max_allowed_packet=60M。528万条数据花了 15分钟。
大数据量的情况主要解决 分页 耗时问题。cpu 不足的情况下 多开线程反而更慢。
以上是关于mysql 大量数据插入优化的主要内容,如果未能解决你的问题,请参考以下文章