10w数据插入数据库的记录(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(),(),()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值