[求助] 千萬級的表怎麼去重複?
一直都是在折騰萬層級的小小資料庫,不知道索引、資料類型等的不同會對效率有多大影響。最近不是密碼 泄露嗎?就下了個,匯入mysql資料庫,共兩千多萬條記錄,只留密碼欄位,其他欄位全部刪除,進行select、insert等測試,有了索引select的效率明顯不同,但在去重複時遇到難題。
方法一:
CREATE TABLE newtable SELECT DISTINCT pwd FROM oldtable
這種方式看起來效率最高,但運行時直接把機器拖死,記憶體一會兒就用完了。
方法二:
逐條擷取再重複資料刪除(每次提取$num條記錄,我的$num=50)
$result = mysql_query("SELECT MIN(id), pwd FROM tablename WHERE id BETWEEN $id AND $num GROUP BY pwd");
while($row = mysql_fetch_row($result)){
mysql_query("DELETE FROM tablename WHERE id>$row[0] AND pwd='$row[1]'");
}
$id += $num;
再通過地址欄或cookie等傳遞$id,效率太低,處理了100分鐘,才刪除了30多萬條重複
請問我應該怎麼做,效率才會更高?謝謝
------解決方案--------------------
建立暫存資料表方法好
之前一般建議別人這樣操作,但不一定能聽進去,小資料量倒無所謂
http://topic.csdn.net/u/20111225/22/7cabedc3-5e9e-42b3-b05b-153ba5a5a67f.html
操作時候佔資源是必須的,,不可避免。。。。。除非你樂意慢慢等待
------解決方案--------------------
2100w,不知道加unique效率如何,你可試下
SQL code
alter ignore table mypwd add unique(pwd);alter table mypwd drop index pwd;
------解決方案--------------------
用暫存資料表吧。create temporary table ....
------解決方案--------------------
試試:
建立表,設定唯一欄位。
匯出sql檔案。
重新source匯入.
------解決方案--------------------
你可以建唯一鍵。不要索引。 重複直接報錯忽略。
select記憶體不夠進,仍要存檔。 而且有distinct. 還要對比重複。 應沒有source快。
------解決方案--------------------
探討
引用:
你可以建唯一鍵。不要索引。 重複直接報錯忽略。
select記憶體不夠進,仍要存檔。 而且有distinct. 還要對比重複。 應沒有source快。
請看我在7樓的回複,如果不給pwd欄位建索引,7樓的效率就非常高了,110秒處理完。是在SQLyog中實現的