10w数据插入数据库的记录(java)——批量插入优化

  • Post author:
  • Post category:java



MobileBook ———— 手机号|姓名|生日|备注


使用联合索引(查数据快)

1、

创建一个HashMap,其中key=“mobile”,value=bookUser

HashMap<String,Object> book = new Hash Map<>()

2、

将book中的key提取出来,放到list中

List mobiles = new ArrayList<>(book.Set())

3、

Mybatis 条件构造 in(“mobile”,list) 返回List repMobiles(数据库已存在的号码)

4、

将已存在的手机号剔除

mobiles – repMobiles = List rightMobiles

5、

根据rightMobiles集合找到相应的key对应的value

最后放到HashMap<String,Object> resultBook

6、

sql语句长度有限,分批插入数据(试出来最大可插入多少数据)

7、

实现:查2s;插入10s左右

注意:

a.SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,

通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。

b.事务需要控制大小,事务太大可能会影响执行的效率。

MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,

这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。



个人记录

  1. 查已存在的手机号

    select * from table where mobile in (‘13911139550’, ‘’) 10W -> List mobiles

    Set mobileSet = HashSet(mobiles);

  2. 收集要插入的手机号

    List results = new LinkedList<>();

    for (1W) {


    if (!mobileSet.contains(mobile)) results.add(mobile);

    }

  3. 插入手机号 & 插入日志表:MyBatis批量操作、批量SQL语句

    批量操作:MyBatis文档。

    批量SQL:insert into table(col1, col2) values(),(),()



版权声明:本文为whitek387原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。