tianhao / 技术天地 / 总结mysql去除数据表中的重复数据 - 北漂...

分享

   

总结mysql去除数据表中的重复数据 - 北漂小石的博客

2010-02-27  tianhao

总结mysql去除数据表中的重复数据
作者:niutian365 日期:2008-03-12
字体大小: 小 中 大
表结构:
create table test
(
sid int(11) not null default '0',
uid int(11) not null ,
utype int(2) not null,
name varchar(32) not null,
age int(3) not null default '0',
phone varchar(15) not null);

原始内容: select * from test;
id uid utype name age phone
1  1 0 zhangsan 10 12345678910
2  2 1 lisi 28 98765432110
3 3 1 wangwu 33 45678912312
4 4 1 zhaoliu 45 78945612354
2 2 1 lisi 28 98765432110
3 3 1 wangwu 33 45678912312

这个表结构字段uid与utype应该是唯一索引,但忘了设置了,现在已经有超过100万条数据
再重新设置唯一索引的话,必须先剔除重复数据
比如上例 中id=3,2重复了,只能留一条;有的数据重复了4次以上
有什么好办法剔除重复数据呢?

Delete from TempA where id not in (select max(t1.id) from TempA t1 group by t1.userid,t1.usertype)

1、确认一下基表和过渡表的数据量。
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 1572864 |
+----------+
1 row in set (2.48 sec)

select count(*) from tmp;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.02 sec)
2、过滤重复记录,将基表数据插入过渡表
create table temp select * from test group by id,uid,name,age,phone;

Query OK, 4 rows affected (3.27 sec)
Records: 4 Duplicates: 0 Warnings: 0
//如只想删除部份记录可带where限定条件: select * from tab_name where id=1 group by id,name,age,phone;
3、删除基表数据,过渡表数据回插。
mysql> truncate table test;
Query OK, 1572864 rows affected (29.44 sec)
mysql> insert into test select * from tmp;
Query OK, 4 rows affected (0.16 sec)
Records: 4 Duplicates: 0 Warnings: 0

4、检查基本表数据
mysql> select * from test;
id uid utype name age phone
1  1 0 zhangsan 10 12345678910
2  2 1 lisi 28 98765432110
3 3 1 wangwu 33 45678912312
4 4 1 zhaoliu 45 78945612354
4 rows in set (0.00 sec)

5、ok,数据准确。

个人结论及疑问:
1、 采用临时过渡表的方式,目前尚在可以忍受的范围之内。100万条记录的表,除了truncate基本表的速度(29.44秒)超出预计,其他操作均在5秒 内,可以看出mysql的速度确实快。当然,测试仅考虑最简单的情况。如果表的字段很多,字段类型复杂,或者表上有索引,这种方式的速度可能会直线下降 (猜测而已)。
2、还是老问题,有没有更好的办法?


本文转载自『北漂石头的博客』

更多精彩内容,欢迎访问北漂石头的博客!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>