mysql 删除记录效率_mysql表删除重复记录方法与效率对比分析

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

复制代码 代码示例:

CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `test`;

/*Table structure for table `test` */

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` char(20) DEFAULT NULL COMMENT '姓名',

`age` tinyint(4) DEFAULT NULL COMMENT '年龄',

`mate` tinyint(4) DEFAULT '1' COMMENT '有无配偶(1-有 0-无)',

PRIMARY KEY (`id`),

KEY `idx_name` (`name`),

KEY `idx_age` (`age`)

) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

现有记录:

复制代码 代码示例:

insert  into `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字段修改成唯一索引:

复制代码 代码示例:

drop index idx_name on test;

alter table test add unique index (name);

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

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

复制代码 代码示例:

alter ignore table test add unique idx_name (name);

它会删除重复的记录(别怕,会保留一条),然后建立唯一索引,高效而且人性化。

2.重建表方法一:

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

复制代码 代码示例:

USE `test`;

/*Table structure for table `test` */

DROP TABLE IF EXISTS `uniq_test`;

CREATE TABLE `uniq_test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` char(20) DEFAULT NULL COMMENT '姓名',

`age` tinyint(4) DEFAULT NULL COMMENT '年龄',

`mate` tinyint(4) DEFAULT '1' COMMENT '有无配偶(1-有 0-无)',

PRIMARY KEY (`id`),

KEY `idx_name` (`name`),

KEY `idx_age` (`age`)

) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

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

复制代码 代码示例:

insert into uniq_test select * from test group by name;

drop table test;

rename table uniq_test to test;

3.删除mysql重复记录法:

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

复制代码 代码示例:

CREATE TABLE `tmp_ids` (

`id` int(11),

`name` char(20)

) ENGINE=MyISAM;

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

复制代码 代码示例:

CREATE TABLE `tmp_ids` (

`id` int(11),

`name` char(20)

) ENGINE=HEAP;

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

复制代码 代码示例:

insert into tmp_ids select min(id),name from test group by name having count(*)>1 order by null;

delete a.* from test a,tmp_ids b where b.name=a.name and a.id>b.id;

truncate table tmp_ids;

4.效率低下的删除mysql重复记录的方法

复制代码 代码示例:

DELETE  test AS a  FROM test AS a,

(

SELECT *

FROM  test

GROUP BY name

HAVING count(1) >1

order by null

) AS b

WHERE a.name = b.name AND a.id > b.id;

总结:

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

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

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

复制代码 代码示例:

insert into tmp_ids select min(id),name from test group by name having count(*)>1 order by null

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值