mysql 删除重复数据_mysql表删除重复记录方法总结及效率对比

下面这些方法在我虚拟机上做的测试,内存384M,交换分区1024M, test共300W数据,重复记录3.5W,需求如题目所示,表结构如下:

CREATEDATABASE/*!32312 IF NOT EXISTS*/`test`/*!40100 DEFAULT CHARACTER SET utf8*/;USE`test`;/*Table structure for table `test`*/DROPTABLEIFEXISTS`test`;CREATETABLE`test` (

`id`int(11)NOTNULLAUTO_INCREMENT,

`name`char(20)DEFAULTNULLCOMMENT'姓名',

`age`tinyint(4)DEFAULTNULLCOMMENT'年龄',

`mate`tinyint(4)DEFAULT'1'COMMENT'有无配偶(1-有 0-无)',PRIMARYKEY(`id`),KEY`idx_name` (`name`),KEY`idx_age` (`age`)

) ENGINE=MyISAM AUTO_INCREMENT=10DEFAULTCHARSET=utf8;/*!40101 SET SQL_MODE=@OLD_SQL_MODE*/;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS*/;

现有记录:

insertinto`test`(`id`,`name`,`age`,`mate`)values(2,'aaaaa',28,0),

(3,'bbbb',23,0),

(4,'cccc',25,1),

(5,'dddd',26,0),

(6,'eeee',24,0),

(7,'fffff',18,0),

(8,'eeee',40,1),

(9,'eeee',60,1);

想去掉name重名的记录,方法如下:

1.给name字段修改成唯一索引:

dropindexidx_nameontest;altertabletestadduniqueindex(name);

这样当向表中添加相同记录的时候,会返回1062的添加失败信息。

但是有一种情况是表中已经有n个重复的记录,这时候我们才想起来要添加唯一索引,再执行上面的操作时,数据库会告诉你已经有重复的记录了,建立索引失败,这时候,我们可以用下面的操作:

alterignoretabletestadduniqueidx_name(name);

它会删除重复的记录(别怕,会保留一条)(但是这个命令在MySQL5.1.37之前是可以的,在5.1.48以后就行不通了),然后建立唯一索引,高效而且人性化。

另外需要注意的是alter ignore table 在percona版本的MySQL行不通,因为它创建索引的方式是:fast index creation

2.重建表方法一:

创建另外一个表,为了防止原来的表结构丢失,可以先创建一个这样的“临时表”,

USE`test`;/*Table structure for table `test`*/DROPTABLEIFEXISTS`uniq_test`;CREATETABLE`uniq_test` (

`id`int(11)NOTNULLAUTO_INCREMENT,

`name`char(20)DEFAUL TNULLCOMMENT'姓名',

`age`tinyint(4)DEFAUL TNULLCOMMENT'年龄',

`mate`tinyint(4)DEFAULT'1'COMMENT'有无配偶(1-有 0-无)',PRIMARYKEY(`id`),KEY`idx_name` (`name`),KEY`idx_age` (`age`)

) ENGINE=MyISAM AUTO_INCREMENT=10DEFAULTCHARSET=utf8;

从test表中查找数据,添加到uniq_test中:

insertintouniq_testselect*fromtestgroupbyname;

drop table test;

rename table uniq_test to test;

3.删除重复记录法:

创建一个表用来存放,要删除的记录的id信息:

CREATETABLE`tmp_ids` (

`id`int(11),

`name` char(20)

) ENGINE=MyISAM;

如果要删除的记录不多的话,可以把这个表创建成内存表形式:

CREATETABLE`tmp_ids` (

`id`int(11),

`name` char(20)

) ENGINE=HEAP;

然后在test表中删除重复记录:

insertintotmp_idsselectmin(id),namefromtestgroupbynamehavingcount(*)>1order by null;deletea.*fromtest a,tmp_ids bwhere b.name=a.name anda.id>b.id;truncatetabletmp_ids;

4.效率低下方法

DELETEtestASaFROMtestASa,

(SELECT*FROMtestGROUPBYnameHAVINGcount(1)>1orderbynull)ASbWHEREa.name=b.nameANDa.id>b.id;

总结:

第一种方法历史22分钟,系统负载5左右;

第二种方法效率非常低下,把未知索引文件破坏,终止执行

第三种方法历时17分钟,其中

insertintotmp_idsselectmin(id),namefromtestgroupbynamehavingcount(*)>1orderbynull

历时15分钟,删除动作历时2分钟,系统负载3左右

第四种方法,执行过程中,把它test的索引文件都破坏了,可见“威力”之大;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值