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的数据刷到磁盘中,
这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。
个人记录
-
查已存在的手机号
select * from table where mobile in (‘13911139550’, ‘’) 10W -> List mobiles
Set mobileSet = HashSet(mobiles); -
收集要插入的手机号
List results = new LinkedList<>();
for (1W) {
if (!mobileSet.contains(mobile)) results.add(mobile);
} -
插入手机号 & 插入日志表:MyBatis批量操作、批量SQL语句
批量操作:MyBatis文档。
批量SQL:insert into table(col1, col2) values(),(),()
标签:java,手机号,mobile,List,插入,SQL,10w,mobiles 来源: https://blog.csdn.net/whitek387/article/details/123089142