MySQL 的一次百萬級數(shù)據(jù)快速去重經(jīng)驗(yàn)分享
最近在處理項(xiàng)目組的一個數(shù)據(jù)集,數(shù)據(jù)量每張表在百萬級,由于數(shù)據(jù)量較大在數(shù)據(jù)下載和處理方面都可以說是曠日持久,這篇記錄一下相關(guān)的經(jīng)驗(yàn)。

「數(shù)據(jù)下載」
拿到的數(shù)據(jù)是在遠(yuǎn)程數(shù)據(jù)庫里面,原先打算直接從遠(yuǎn)程庫里下載 csv 或 txt 到電腦上,但在 mysql 上進(jìn)行這樣的操作好像不是很方便速度也很慢。
目前在使用的方法是將遠(yuǎn)程數(shù)據(jù)庫里面的數(shù)據(jù)導(dǎo)出為 sql 到本地,導(dǎo)入本地數(shù)據(jù)庫后進(jìn)行操作,但這一過程也很緩慢,一個百萬級數(shù)據(jù)庫在 navicat 里面可能要導(dǎo)個半個小時,在命令行可能會快一點(diǎn)但沒有嘗試。
「MySQL中的去重」
基本思路是復(fù)制原表 A 結(jié)構(gòu)新建一個表 B,對表 B 添加 UNIQUE 約束,然后將表 A 中的數(shù)據(jù)逐條插入表 B,約束會自動實(shí)現(xiàn)去重。
復(fù)制表結(jié)構(gòu)
CREATE TABLE newTable LIKE oldTable;
修改表字段,因?yàn)?httpURL 太大
ALTER TABLE newTable MODIFY httpURL VARCHAR(300);
為表格添加約束條件(在Mysql5中,如果約束字段過大,則報錯,因此要先執(zhí)行上面的修改表字段)
ALTER TABLE newTable ADD UNIQUE(IP,timeStart);
為新表中添加數(shù)據(jù)(約束條件自動去重)
INSERT IGNORE newTable
SELECT \* FROM newTable
ORDER BY IP,timeStart;
測試的表數(shù)據(jù)量在三百萬左右,去重后數(shù)據(jù)在二百萬左右,在 navicat 實(shí)現(xiàn)時間2168.470s,命令行應(yīng)該會更快。
評論
圖片
表情
