mysql大量数据去重的逻辑思维和示例

[mysql] 2021-12-02 圈点425

摘要:mysql大量数据去重的逻辑思维和示例

有时候有大量的mysql数据需要去重,百万级别的索引去重在sql中可以直接处理,配置一般的情况下问题不大;可如果数据量上亿,甚至10亿,百亿,千亿;那在sql中去重,感觉效率太低,花费的时间太长,也有可能是sql语句不到位。经过研究分析,感觉还是在程序中进行去重比较快,而且在程序中去重可以不限制是否索引。实测2种在程序中去重的思维方法和示例。


1,大量数据去重逻辑思维(1)

条件:id为主键,需要去重的字段为ads

逻辑思维:遍历所有数据,去重后取key数组即所有需要保存的id数组值,然后与原id数组值取差集,就是要删除的id数组值。然后依次删除id即可。


操作步骤:取表中所有数据,遍历,组成新的二维数组id为键,ads为值。先自身array_unique取array_keys数组(即需要保存的id数组),然后此id数组和全id数组取差集,差集就是要删除的id数组。缺点如果数据量太大的话,会占用太大内存,会直接溢出报错;




2,大量数据去重逻辑思维(2)

在1的情况下,数据量太大,占用的内存直线上升,会提示内存太小。在1的基础上,可以对数据进行分组处理。

条件:id为主键,需要去重的字段为ads

逻辑思维:根据内存的大小将数据按$slice 划分成N份,然后遍历每一份先自己去重,删除id数组;然后分别与后边的N份合并去重。

操作步骤及示例:

将$all 分成 $arr1,$arr2,$arr3...

然后先将自身数组去重,按id值删除重复的数据。

然后循环,从$arr1开始,分别与$arr2,$arr3...去重(交集),按id值删除重新数据。


分析:循环的次数会和分成的份数成正相关比例,所以份数可以按内存的极限进行优化,尽量分成少的份数

mysql  去重  

感谢反馈,已提交成功,审核后即会显示