Bootstrap

Mysql的insert批量插入性能问题

当需要往数据库插入大量数据是,一条一条插入会导致插入时间长,性能不佳,所以我们一般会进行insert批量插入,一次性插入较大批次的数据,而不是每条记录单独插入,这通常会提高性能,因为批量操作减少了上下文切换和 SQL 解析的开销。但由于一次性插入大量数据,事务期间锁的持有时间会较长,可能会影响到其他并发操作。

单独插入:

INSERT INTO my_table (column1, column2) VALUES (value1_1, value1_2);
INSERT INTO my_table (column1, column2) VALUES (value2_1, value2_2);
-- ...
INSERT INTO my_table (column1, column2) VALUES (value1000_1, value1000_2);

批量插入:

INSERT INTO my_table (column1, column2) VALUES 
(value1_1, value1_2), 
(value2_1, value2_2),
-- ...
(value1000_1, value1000_2);

批量插入有优点也有缺点,它可以保证数据一致性,所有插入操作要么全部成功,要么全部回滚;他可以减少事物开销,仅需启动和提交或回滚一次事务。但是我们知道InnoDB引擎是在执行到需要加锁的语句时才加锁,但是释放锁是在事物提交或回滚的时候,批量插入的数据过多会导致事务时间较长事务期间,所有涉及的表或行会被锁定(根据具体的存储引擎),可能会导致更长时间的锁定,从而影响系统的并发性能,且资源占用高,大事务可能会占用较多的数据库资源。

所以当批量插入的数据过多时,为了防止大事务的产生,我们可以分批插入,例如10w行数据我们可以每次插入1000行,分100次插入。分批插入可以降低锁时间,每个事务的时间较短,从而减少了锁定时间,提高了并发性能;减少资源占用,每个小批次事务占用的资源较少,降低了系统的资源负载。同时分批插入也有数据一致性风险,如果在批次中途出现失败,部分数据可能已经插入,而部分数据可能未插入,需要额外处理数据一致性;事务开销增大,多次开启和提交或回滚事务会增加事务管理的额外开销。

所以在数据一致性要求高的时候,不建议分批。同时

;