开发者社区> 问答> 正文

一个都会遇到的性能瓶颈的问题,如何优化?:报错

相信大家在做系统都肯定遇到过提供文档上传Excel文档的功能吧?
那么大家肯定会考虑过如果文档操作10w条数据,我的接口会挂吗?
好吧,我也遇到了,先说说的我的问题把。
我现在有个上传用户信息Excel文档的接口,读取Excel文档的数据转化成List,然后循环插入,好了,有人要问为什么不批量插入喃?我苦啊,我没有办法啊,因为老板说你必须要保证用户的活动Id(用户参与的活动的主键)和用户的电话这两个属性必须唯一,所以我在每次插入都会进行一次判重,所以造成了一个坑定的局面,这个接口经常报警,呵,老板说,你不想干了吧?
所以,各位大神,有什么好的建议?
顺便提提,上传6.5w条数据,判重的操作花费50s,保存用户的操作大概360s,Excel文档转List花费4m,暂时没有内存溢出的情况发生,另外,这个是一个同步的接口,异步的方式由于系统更变太大,最为最后的手段,谢谢。

展开
收起
kun坤 2020-06-08 19:23:20 868 0
1 条回答
写回答
取消 提交回答
  • 当然要批量导入啊。
    excel转换成特定SQL文件然后导入数据库。
    这里去重,可以考虑一张临时表。
    然后插入数据可以使用如mysql的ignore
    :
    insert ignore into table_main(id,phone,other) 
    select id,phone,other from table_temp_uuid; ######

    引用来自“vvtf”的评论

    当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的 ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; 临时表方案靠谱。###### 首先,判断重复用数据库的uniq来做(程序里处理uniq的报错),而不是自己写代码另外去判断。 大数据量的导入建议用csv,读一行导一行,内存占用小。如果非要用excel,记得服务器内存要设置大点。 ######你说的那两个字段加入唯一约束 . 然后开启事务,循环插入,如果插入失败,则改为更新(或你自己的逻辑). 这样快,但肯定很消耗CPU. ######为什么不在list里面去重,再一次导入######这样数据库只需要批量插入的时候维护一次索引,如果修改的其他字段没建索引,那么update是不需要维护索引的######看能不能插入之前拆出2个list,一个是重复的,一个是不重复的(这样拆之前需要select……for update,防止其他事务修改数据)######

    引用来自“death_rider”的评论

    为什么不在list里面去重,再一次导入 赞同。具体设计问题不明确不好给意见。不过系统和算法设计中有点是可以肯定的:逻辑处理和数据载入尽量分开。 在单纯的算法设计中,往往不会去考虑数据迁移的成本,这是比较理科的分析方式,而在系统开发过程中,数据迁移的成本是必须要考虑的,这是工程化的必然。 数据迁移,这里是广义上的,包括,数据的转移,从磁盘到外部存储(主板上所谓的内存),从外部存储到片内存储(soc,cpu的内部cache,差异在于无需外部总线);也包括,通过网络在不同处理设备之间的转移;同时还包括数据的结构调整,如数据清洗在逻辑层面的工作。 楼主应该考虑数据的预清洗或后处理。当然具体用哪种更合适,还要自己根据数据的来源,数据之间的关联性,数据处理的实时性等要求来判断。 哈,反正是个系统设计层面的工作。不是工具选择层面的事务。 ######回复 @首席打酱油 : 把需要比对的,做md5等散列数据,可把大概率数据测出来。只有命中时才进行比对。这些工作,需要额外的数据组织,同时需要额外的编程。这些数据过滤的算法,如果用c我看不出有啥太大计算量。######目测楼主说的不能重复不仅是指Excle中的数据不能重复,而且还要Excel中的数据和现有数据库中的数据不能重复,所以不能单纯的把Excle中的数据加载到List中内存去重######

    引用来自“vvtf”的评论

    当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的 ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; 一般怎么把EXCEL转换成SQL文件呢?######如果你的excel本来就是符合load data infile的文件格式, 都不需要解析的。######就是解析excel啊。所以这个方案的耗时也就是解析excel这里。当然这可能也浪费不了多少时间的。 我这里是对MySQL的方案。 解析成对应的MySQL能解析的。比如load data infile。 或者批量insert也行。 然后source。6W条瞬间插入的。######数据直接用com接口导出(服务器处理),分布式处理也行,但是不做任何处理,极限速度,10w体积很小的,1m?连1个高清png的大小都没有,数据也是可以压缩的,重复的数据会压缩很多,上传和带宽不是瓶颈,主要是数据逻辑处理和数据库瓶颈,你处理的时候解析到内存,一个瓶颈,倒入数据库又temp table,还是内存,数据库的内存,又一个瓶颈######你要懂服务器编程才行啊,很多处理单机导出数据还可以,服务器就不这么处理了,还有就是数据库,知道temp table,stor procedure,导入导出,那是数据库初级而已######主要问题在“ Excel文档转List花费4m”,只能异步了。
    2020-06-08 19:23:25
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
如何做小程序性能优化 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载
Cassandra 性能压测及调优实战 立即下载