客户单号重复验证效率优化方案

mingl11 2019-01-22 03:57:24
项目里有个订单导入功能(Excel导入),单号是客户自己定义的,导入需要验证客户的单号在库里是唯一的,现在遇到的问题是数据库数据量不断增大,验证重复效率就很低,尤其当一次性导入量比较大(10W左右订单)。做过一次优化是把库里的单号都取出来在内存中进行比对,这样暂时是达到了目的,但是这个后面数据量越来越大又不是长久之计。请有处理过类似情况的朋友分享下经验。
...全文
336 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingl11 2019-01-24
  • 打赏
  • 举报
回复
当然导入过程中肯定不单单有单号重复校验,不过这个是最消耗时间的。
mingl11 2019-01-24
  • 打赏
  • 举报
回复
引用 7 楼 以专业开发人员为伍 的回复:
你应该说出在10W随机单号的单子导入时,这个所谓的“效率很低”是指花5分钟导入还是花2小时导入。因为不同的时间,有不同的技术含义。

前辈说的是,现在就是发现导入数据越多,时间会指数级上升,测试导入10W都要花费1个多小时,这种体验放给客户肯定是不行的。希望能达到10W单10分钟以内才好。
  • 打赏
  • 举报
回复
引用 5 楼 吉普赛的歌 的回复:
这样就达到了批量处理的效果, 也不需要消耗那么大的内存
嗯,其实“消耗内存”是为了将比较效率提高几十倍。
  • 打赏
  • 举报
回复
你应该说出在10W随机单号的单子导入时,这个所谓的“效率很低”是指花5分钟导入还是花2小时导入。因为不同的时间,有不同的技术含义。
  • 打赏
  • 举报
回复
引用 楼主 mingl11 的回复:
现在遇到的问题是数据库数据量不断增大,验证重复效率就很低,尤其当一次性导入量比较大(10W左右订单)。
如果你不给出具体的时间数值,会误导许多人。 在最基本最简单的数据库对象都已经创建以后,如果你只是关心数据库表操作,那么也没有太大改进,奇怪的说法其实也结果基本上一样(所以基于实际测试实际运营才知道)。
吉普赛的歌 2019-01-23
  • 打赏
  • 举报
回复
1. 一次性将 导入的数据 插入到一个中转表; 2. 比较中转表与目标表, 只需要一条 sql 就能搞定了。 这样就达到了批量处理的效果, 也不需要消耗那么大的内存
吉普赛的歌 2019-01-23
  • 打赏
  • 举报
回复
引用 8 楼 以专业开发人员为伍 的回复:
[quote=引用 5 楼 吉普赛的歌 的回复:] 这样就达到了批量处理的效果, 也不需要消耗那么大的内存
嗯,其实“消耗内存”是为了将比较效率提高几十倍。[/quote] 这种情况下不一定大量消耗内存就多高效吧。 如果用 redis 之类的, 还是要把数据从数据库中取出到 redis, 两者再比较, 取出本身需要时间, 大量数据也占用内存。 当然, 多说无益, 最好能测试一下。
游北亮 2019-01-22
  • 打赏
  • 举报
回复
mysql的性能没有你想象的那么差,多数是没建索引或设计不合理。 1、建数据库索引,对单个key的查找,性能不会比redis差多少,性能损耗主要在TCP连接上; 2、用Redis做永不过期的缓存,相当于把Redis当成数据库来用了; 放在内存里的弊端,就是重启要重新加载,而且服务跟Redis毕竟不是一个专业的东西。
winner2050 2019-01-22
  • 打赏
  • 举报
回复
单号字段加个索引就行了,根本不需要修改代码。亿级查找唯一一个单号是否重复都是一瞬间就完成的。
mingl11 2019-01-22
  • 打赏
  • 举报
回复
引用 1 楼 娃都会打酱油了 的回复:
用Redis,里面的Hash类型

考虑过,不过想着和放内存性质一样。不知道您指的是怎么个用法,能否具体再说下
  • 打赏
  • 举报
回复
用Redis,里面的Hash类型

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧