面试官:百万数据如何快速导入导出?一通问下来直接问麻了。。

作者: 图灵诸葛讲Java分类: 计算机技术 发布时间: 2023-11-01 20:20:37 浏览:6349 次

面试官:百万数据如何快速导入导出?一通问下来直接问麻了。。

爱像深蓝:
就这水平,那你也没什么必要写代码了,讲架构去吧,100万条记录写入最开始居然要5分钟就不说了,100多秒写入100万行记录,这种水平垃圾还是垃圾都有自己的标准,在下就用数据来打脸,昨天特意测试了一下,用的是原生的mysql提供的csv引擎导入,也就是纯写sql使用load语句导入csv。思路也很简单使用npoi将excel转为csv。再导入,时间有限只测试了导入百万行记录多线程执行20秒左右。可见这个阿里的所谓OOXML 操作工具性能有多垃圾,如果使用SqlSugar框架的话,性能也许会碾压,都说80%的搞java的朋友吹牛逼可以把牛都吹到胡非洲去在下感觉也许是真的。 说下整体的思想吧: 第1 多线程抓取每个sheet没问题,但你这使用@注释来反射的做法也太low了,使用接口或抽像方法反向调用不会吗?不会就看下netty的源码。 第2 每个线程抓取的数据进队列,这样可避免多线程操作数据准备入库时的冲突,每个线程抓取到的sheet数据直接入队,另外一端开一个线程定期不断扫描队列,如我设置的是1s扫描一次,一次出队所有数据直接再开线程写入数据库。 第3 写入的策略就是csv化再使用load命令直接本地化加载。使用load的速度比传统的sql语句还是事物要强十倍。

【回复】看样子是技术大牛呀! 其一,他们就是做培训的,更多的技术启蒙,带小白入门,偏向于基础。人家列的就是从最简单的单线程到多线程整个过程中的性能提升。给小白体会多线程的意义。单纯的讲导入数据,方法方式很多,这里肯定称不上完美,真的遇到类似问题,那就是按照这种思路自己去扩展就好。话说回来,现实中真要是动不动就百万数据导入到处,以解决问题的思路,一般先想到的难道不是db处理,你真以为代码是万能的性能最高的吗。 其次,聊到技术,这里使用@注解,反射,,考虑的难道不是后边有其他excel开发任务,做到代码复用吗,只需要关注业务逻辑,不需要在纠结excel的转换过程,已做到功能复用。 最后,你提的方案确实性能更好,但没必要一上来就咄咄逼人,这个垃圾那个垃圾的,恨不得否定整个行业。B站更多的就是给小白入门,稍加提升。当然也不是否认这里依然有很多大牛。你的技术牛逼你就应该去社区去论坛,给那些原作者提提有创造性的意见,或者去github建几个你自认牛逼的项目,看看⭐能不能过五十先。 虽然都是程序员,你能不能先把你那非主流的发型图片换了
【回复】你这是纯导入,别人要求导入的时候做业务逻辑处理,甚至还有公式、数据类型处理,你CSV有屁用。。。。
梦想帝王蟹自由:
真正生产不可能这么压榨性能的,跑这一个导入导出,都可能直接影响到生产的服务了;一般都是分批流式导出,不可能像你这样胡来的

【回复】冷静,他只是展示下他又开发了个小工具而已[doge]
【回复】是的,这个只能是demo,同时视频中的demo还有很多问题,真实需要考虑的问题很多,例如单库多线程读取要考虑深分页,同时不能影响数据库主从同步;还需要考虑数据库的写入瓶颈;excel方案本身就有问题
【回复】真正导入也不太可能分sheet,毕竟会大大增加业务的操作
我也要跑快快:
老师您好,请问一个问题,我这也是导入多行数据,Excel差不多有40列 但是其中一些列,比如有一个生产厂家,我要去数据库验证有没有这个厂家名称,没有的话新增并返回ID,因为最终插入的表中要存厂家ID,有的话返回ID 像是这样列,有差不多10列左右,就导致我这导入特别慢 请问有什么好的解决办法吗?

【回复】回复 @我也要跑快快 : ”将返回的数据当做一个新表直接插入”意思是,你最终都是需要name和id的将这两个字段要导入的当前的表的唯一字段匹配上,再做一次update。大致的意思就是你第一次导入的时候先排除那10列,先新增其他30列,同时异步的新增检索排除的10列,最后做并发update那10列。这个方法可能不对,我只是提供一个思路
【回复】回复 @此用户以消失 : 非常感谢您提供的思路[星星眼],现在导入比之前快了近一倍
【回复】回复 @此用户以消失 : 首先感谢您提供的这个方法。 先将这10列做LIst集合,然后去查询ID,但是“将返回的数据当做一个新表直接插入”这个我没能理解,我能想到的是,将查询到的ID,替换到原有的值,再走多线程的插入 这样的话,确实可以大幅度的减少数据库的查询,晚些时候我试一下
Hrqstn-Elq:
怎么导入那种有则更新无则新建的设备表,而且表里imei是唯一的,插入的时候明显会影响到其他业务

【回复】sql上做文章(replace into ,on update等关键词),或者解析时查一遍数据库(不推荐,性能太差),可以把数据库内唯一索引的列查出来,用唯一索引值做key存在map放在内存,哪怕数据库内有几百万条数据都没关系,几百万的map在生产机器的内存里很正常的,利用map的快速查找特性可以分辨出哪些数据是新增的哪些是更新的,两个list分别批量插入或更新[吃瓜]
清风明月随我意:
生产导入master,slave自动同步。百万数据还算比较少的。

我TMD开花:
[doge]我们每天都上亿了 你还导出个锤子

蚂蚁骑火车:
把那几列单拎出来做个业务 插入就做插入

奥利哈剛:
mysql不是提供 load file 语句导入吗,会避免大量重复io

程序员 编程 百万数据导入导出 面试 java 性能优化 编程开发 百万数据 Java面试 程序员研究所

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读