对之前所涉及的mysql进行批量数据的导入简单的进行了下总结,我的项目数据规模一般在1千万到2.5千万。
通过项目与网上的资料,影响批量导入性能的主要因素大致有以下几点:
1.采用单insert 多 values 方式进行插入替代多个insert,可以减少网络传输次数,同时提高了mysql端日志的处理速度,影响较大。
2.在事务层进行批量导入,而不是service层,换句说,通过事务进行处理。
3.插入数据最好以索引有序进行提交,可以减少mysql对索引的维护成本,不需要mysql进行大规模负责的调整索引树。
4.除了常规insert……方法,还有on duplicate key update……语句可以使用,在进行数据插入时会判断是否存在该key,若存在则执行update,不存在就直接插入,明显可以减少业务逻辑上面的复杂程度。这里可以结合第三条的一个例子,若索引字段也是duplicate key,那么update时不会影响索引B+tree,因为key没有变化,在大量数据面前有极大的优势和性能的提升,远好比先delete再insert,或者一种等价的先delete再insert的replace语句。
5.采用多线程同时写库,该方法见有网友提到,在我的项目中使用过改该方法,效果不明显,有待深究,我猜测是我对线程数量和每次提交数量控制的不好。
6.实际的项目中感觉很难提升性能,主要压力在于数据库的瓶颈。
7.另外,不同的机器配置,数据库可能最优的批量处理规模不同,并不是越多越快。
8.以上是自己总结和收集到的一些心得与经验,后面会抽时间,做一次全面的实验,这里先进行简单记录,可能有不妥之处。
网友评论