记一次千万数据去重和关联字段的坑

一、需求

一个mysql的数据库,其中一张交易记录表order,有千万的数据,另一张用户表user,有26k的数据。首先要把order表中的交易记录去重,再把user表中的username通过userid字段关联到order中去,最后导出关联好的数据。

二、处理

电脑使用的Mac pro 32g

(一)原处理方案

(1)sql方式去重

在order表中使用sql语句来去重,涉及重复的字段有三个。
代码如下:

// sql 去重(示例)
select  * from order c1 left join user c2 
on c1.userid=c2.userid and c1.id < c2.id

运行速度很慢,等待半小时后,见不到效果,果断放弃;

(2)用excel方式去重

按每50万条记录分别导出20余个xlsx文件,然后用excel分别去重,再导入回mysql中等待关联username字段。

(3)用视图view关联username字段

分别将20余个去重完毕再导回mysql的表与user关联,再导出含有username字段的excel文件,也是20余个。

(二)新处理方案

(1)将order表导出为csv文件,然后利用python编写几条语句处理;

// python去重csv
import pandas as pd
mydata = pd.read_csv('/Users/nono/Order.csv')
data = mydata.drop_duplicates(subset=['id'], keep='first', inplace=False)
data.to_csv('/Users/nono/Order.csv', encoding='utf8')

(2) 将去重完的csv导回mysql的导表order1

(3)将user表中的userid字段生成索引(这里很关键

要建立的索引涉及3个字段,最开始每个字段长度是255,总数是765,超过了mysql能建立的索引的长度,所以老是失败。后来把3个字段的长度减少一些,就成功建立,于是开始了惊人的转折。其实最开始的时候也尝试建索引,但是失败了,就没有多想,也没有多做尝试,对索引的作用没有太在意,导致中间走了弯路。

(4)将表order1与user表关联,导出数据。

三、总结

1、原方案非常费时间,每一个文件的处理动则半个小时,前后差不多花了三天才能处理完。后来一想,其实如果一开始就对user表建了索引,也不至于这么费时间。中间还想用存储过程去对order表去重,发现速度也很慢。当建了索引后,最后几个表的处理也很快,包括关联视图的打开时间也很快,用不了半个小时,十秒钟就能打开视图。
2、一个意外的惊喜是用python处理大数据量的csv,没想到效率这么高。
以上,踩坑记录。
2022年9月12日 于北京


版权声明:本文为jamike原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。