mysql count if 去重_MYSQL数据去重
我們用的數(shù)據(jù)庫是mysql,偶爾會因?yàn)槌绦蛱幚砩系姆奖慊蛘遱ql未優(yōu)化而增加了一些重復(fù)數(shù)據(jù),最后需要對這些重復(fù)的數(shù)據(jù)進(jìn)行刪除
對于數(shù)據(jù)量不大的時候我一般用not in的方式來處理,或者刪全表,導(dǎo)出不重復(fù)的數(shù)據(jù),然后再insert的方式,網(wǎng)上也提供了很多方式,但是很多都需要執(zhí)行很長時間,而且資源占用很多,對于數(shù)據(jù)量大的時候被DBA否決了
比如表tb1中的結(jié)構(gòu)為
id ? ?param1 ? ?param2 ? ?param3 ? ?date
其中id為主鍵,param為需要去重的項(xiàng)
一、not in的方式(可以用一條sql或者用腳本來處理,但是一條sql會執(zhí)行時間太長)
DELETE FROM tb1 WHERE id not in (SELECT id FROM tb1 GROUP BY param1, param2, param3);
或者當(dāng)數(shù)據(jù)量大的時候,一維或者多維分步操作
DELETE FROM tb1 WHERE param1='param1' AND id not in (SELECT id FROM tb1 WHERE param1='param1' GROUP BY param1, param2, param3);
notin的方式我在冗余時數(shù)據(jù)總量在百萬級的時候,好像還行,問題也不是很大,但是當(dāng)上千萬量級的時候,DBA就開始過來找我了
二、刪除數(shù)據(jù),然后插入distinct數(shù)據(jù)
SELECT param1, param2, param3, date FROM tb1 GROUP BY param1, param2, param3;
DELETE FROM tb1;
INSERT INTO tb1 (param1, param2, param3, date) VALUES ......
DBA不太同意我這種方式
DBA建議我用in的方式,于是我就想到了用shell進(jìn)行處理
三、用shell腳本幫忙篩選然后用主鍵in的方式來刪除
SELECT id FROM tb1 GROUP BY param1, param2, param3 > ids.csv
SELECT id FROM tb1 >> ids.csv
cat ids.csv|sort|uniq -c| awk '{if($1==1) print $2}' > delete_ids.csv
DELETE FROM tb1 WHERE id IN delete_ids
或者分維度處理也行,減小數(shù)據(jù)庫壓力
這種方式ids.csv文件中先輸入了去重param1,param2,param3的id,然后再把所有id再次加入進(jìn)去,這樣我們需要保留的id的count就為2了,利用shell的sort和uniq工具,就可以篩選出來需要delete掉的id了,于是大功告成了,
我采用的是分一個維度來刪的(也就是分不同的param1來處理),最終1.2y數(shù)據(jù)中刪除4kw的冗余,輕輕松松就解決掉了,DBA毫無壓力(param1建了索引)
總結(jié)
以上是生活随笔為你收集整理的mysql count if 去重_MYSQL数据去重的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql5.7.14操作命令_Mysq
- 下一篇: mysql join null_Mysq