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内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作

注意事项:

  1. SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。

  2. 事务需要控制大小,事务太大可能会影响执行的效率。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 不足的情况下 多开线程反而更慢。

猜你喜欢

转载自blog.csdn.net/yonghutwo/article/details/123782290