引言
在做一个项目的时候,涉及到需要从一个表格中获取百万条数据然后插入到数据库中,最后采用JDBC的executeBantch方法实现这个功能。
采取的策略
尽量关闭字段索引(因为再插入数据的时候还是需要维护索引的,在创建索引和维护索引 会耗费时间,随着数据量的增加而增加,可以在插入数据后再去为字段创建索引)
虽然索引可以提高查询速度但是,插入数据的时候会导致索性的更新。索性越多,插入会越慢。可以看文档描述:
Although it can be tempting to create an indexes for every possible column used in a query, unnecessary indexes waste space and waste time for MySQL to determine which indexes to use. Indexes also add to the cost of inserts, updates, and deletes because each index must be updated. You must find the right balance to achieve fast queries using the optimal set of indexes.分批次提交数据
在分布式条件下,还可以考虑在不同的数据库结点提交,有底层的消息系统完成数据扩展
- 过滤预处理数据
预处理数据的场景:为了避免插入的数据(假设ListA)跟数据库中某些数据重复,那么我们会把要插入的数据去数据库中查询是否已经存在,获得返回的已经存在数据(ListB)。然后在插入数据的时候判断当前数据是否在ListB中,那么当前数据不能够插入数据库。过滤出来,最后得到一个可以插入数据库的ListC
代码
关键代码
|
完整代码
|
总结
有些网友发现使用StringBuffer 来拼接入参,不通过prepareStatement的预处理,虽然前者速度很快,但是使用prepareStatement可以防止SQL注入
有的好的建议大家都可以提出来