鍍金池/ 問答/PHP  數(shù)據(jù)庫/ 200萬條數(shù)據(jù)的Mysql表中如何高效去除重復(fù)數(shù)據(jù)?

200萬條數(shù)據(jù)的Mysql表中如何高效去除重復(fù)數(shù)據(jù)?

下圖示范表中有存在著同名name和type時,僅保留time最新的一條.
如何才能高效完成去除,注意先排除復(fù)制表重索引的方法,因?yàn)樾枨鬄閷?shí)時插入或刪除.謝謝大家!
補(bǔ)充一下:數(shù)據(jù)本身是合理的,所以無需在插入數(shù)據(jù)這方面費(fèi)神.,關(guān)鍵的是如何高效率的處理,因?yàn)楫?dāng)數(shù)據(jù)量多時例如目前的200W條,用通常的嵌套如in or not in(select... group by)此類效率太低了.尋求更高效的方案.

下圖表的數(shù)據(jù)更通俗的例子:
用戶張三購買了計算機(jī)科目3本,英語科目5本.
用戶李四購買了計算機(jī)科目3本,物理科目1本.
需求:僅保留用戶每個科目的最后一次購買記錄.

圖片描述

回答
編輯回答
枕頭人

不好意思,寫完了才看清你的標(biāo)題是 保留最新時間的,你可以根據(jù)下面的思路改改

不太明白你所說的高效是指盡快完成需求呢還是從數(shù)據(jù)庫優(yōu)化的層面來說
如果盡快完成需求的話,試試這條sql
delete from table_name where id not in (select id from (select min(id) as id from table_name group by name, type) as t);

解釋:
① group by name, type 去重查詢
② select id from (select min(id) as id from table_name group by name, type) as t
這條sql中嵌套from子查詢是因?yàn)?mysql 不支持對同一個表查詢后做增刪改操作

2017年6月5日 00:35
編輯回答
青檸

既然是"實(shí)時插入或刪除",為啥在插入時不用replace呢

2017年7月31日 16:24
編輯回答
若相惜

沒什么糾結(jié)的,需求就是實(shí)時插入刪除,肯定是要代碼里面做嘛,事務(wù)里面做就可以了啊,
先按用戶查一次,有就刪除該用戶所有記錄(歷史數(shù)據(jù)也可以順便清理掉了),然后插入新的不就完了

2018年2月12日 13:56