加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2020-12-12 02:44:54 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL教程mysql表删除重复记录方法与效率对比分析》要点: 本文介绍了MYSQL教程mysql表删除重复记录方法与效率对比分析,希望对您有用。如果有疑问,可以联系我们。 导读:在虚拟机上做删除mysql表中重复记录的测试,内存384M,交换分区1024M,test共300W数据

《MYSQL教程mysql表删除重复记录方法与效率对比分析》要点:
本文介绍了MYSQL教程mysql表删除重复记录方法与效率对比分析,希望对您有用。如果有疑问,可以联系我们。

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

MYSQL必读在虚拟机上做删除mysql表中重复记录的测试,表结构如下:
?

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 */;
?

MYSQL必读现有记录:
?

insert? into `test`(`id`,`name`,`age`,`mate`) values (2,'aaaaa',28,0),
(3,'bbbb',23,
(4,'cccc',25,1),
(5,'dddd',26,
(6,'eeee',24,
(7,'fffff',18,
(8,40,
(9,60,1);
?

MYSQL必读想去掉name重名的记录,办法如下:
1.给name字段修改成唯一索引:
?

drop index idx_name on test;
alter table test add unique index (name);
?

MYSQL必读这样当向表中添加相同记录的时候,会返回1062的添加失败信息.
但是有一种情况是表中已经有n个重复的记录,这时才想起来要添加唯一索引,再执行上面的操作时,数据库会告诉你已经有重复的记录了,建立索引失败,这时可以用下面的操作:
?

alter ignore table test add unique idx_name (name);
?

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

MYSQL必读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,
? KEY `idx_age` (`age`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
?

MYSQL必读从test表中查找数据,添加到uniq_test中:
?

insert into uniq_test select * from test group by name;
drop table test;
rename table uniq_test to test;

MYSQL必读3.删除mysql重复记录法:
创建一个表用来存放,要删除的记录的id信息:
?

CREATE TABLE `tmp_ids` (
? `id` int(11),
? `name` char(20)?
) ENGINE=MyISAM;
?

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

CREATE TABLE `tmp_ids` (
? `id` int(11),
? `name` char(20)
) ENGINE=HEAP;
?

MYSQL必读然后在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;

MYSQL必读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;
?

MYSQL必读总结:
第一种办法历史22分钟,系统负载5左右;
第二种办法效率非常低下,把未知索引文件破坏,终止执行
第三种办法历时17分钟,其中
?

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

MYSQL必读历时15分钟,删除动作历时2分钟,系统负载3左右
第四种办法,执行过程中,把它test的索引文件都破坏了,可见”威力”之大.

欢迎参与《MYSQL教程mysql表删除重复记录方法与效率对比分析》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读