由于mysql不支持同时对一张表进行操作,即子查询和要进行的操作不能是同一张表,因此需要通过临时表中专以下。

1、单字段重复

生成临时表,其中uid是需要去重的字段

create table tmp_uid as (select uid from user_info group by uid having count(uid))

create table tmp_id as (select min(id) from user_info group by uid having count()uid)

数量量大时一定要为uid创建索引

alter table tmp_uid add index 索引名 (字段名)

alter table tmp_id add index 索引名 (字段名)

删除多余的重复数据,保留重复数据中id最小的

delete from user_info
where id not in (select id from tmp_id)
and uid in (select uid from tmp_uid)

2、多字段重复

如以上由于uid的重复间接导致了relationship中的记录重复,所以继续去重。

2.1 一般方法

基本的同上面:

生成临时表

create table tmp_relation as (select source,target from relationship group by source,target having count(*)>1)

create table tmp_relationship_id as (select min(id) as id from relationship group by source,target having count(*)>1)

创建索引

alter table tmp_relationship_id add index 索引名(字段名)

删除

delete from relationship
where id not in (select id from tmp_relationship_id)
and (source,target) in (select source,target from relationship)

2.2 快速方法

实践中发现上面的删除字段重复的方法,由于没有办法为多字段重建索引,导致数据量大时效率极低,低到无法忍受。最后,受不了等了半天没反应的状况,本人决定,另辟蹊径。

考虑到,估计同一记录的重复次数比较低。一般为2,或3,重复次数比较集中。所以可以尝试直接删除重复项中最大的,直到删除到不重复,这时其id自然也是当时重复的里边最小的。

大致流程如下:

(1)、选择每个重复项中的id最大的一个记录

create table tmp_relation_id2 as (select max(id) from relationship group by source,target having count(*)>1)

(2)、创建索引(仅需在第一次时执行)

alter table tmp_relation_id2 add index 索引名 (字段名)

(3)、删除重复项中id最大的记录

delete from relationship where id in (select id from tmp_relation_id2)

(4)、删除临时表

drop table tmp_relation_id2

重复上述步骤(1),(2),(3),(4),直到创建的临时表中不存在记录就结束(对于重复次数的数据,比较高效)

本文章转自 http://www.cnblogs.com/rainduck/archive/2013/05/15/3079868.html

mysql数据去除重复及相关优化(转)的更多相关文章

  1. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  2. mysql数据库去除重复数据

    (一)最原始的方法: delete from test where id not in (select * from ((select min(id) from test group by(name) ...

  3. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  4. mysql中去除重复字段-distinct

    1.注意事项 使用distinct命令时需要放在查询条件的开头,否则会报错.如果需要查询的项目很多但只针对某一个字段使用distinct的,则可以利用内容拼接的方式来实现. --基本查询 SELECT ...

  5. mysql数据去重复distinct、group by

    使用distinct 和group by都可以实现数据去重. select distinct 字段 group by 一般放在where条件后

  6. oracle 相关查询和非相关查询,oracle 去除重复数据,以及oracle的分页查询!

    一.oracle中的相关查询?和非相关查询? 二.oracle去除重复数据 1. 2. 3.oracle 实现分页? 利用rownum的唯一性,和子查询,将rownum从伪列变成实际列!

  7. mysql 去除重复数据

    1. 问题描述 有时load或者insert操作导致 表数据有重复 2. 解决方案 通过临时表.主键id.倒腾去重 示例 2.1  create table student( name varchar ...

  8. Mysql数据优化--DBA梳理珍藏篇

    1. 优化SQL 1)     通过show status了解各种sql的执行频率 show status like 'Com_%'        了解 Com_select,Com_insert 的 ...

  9. mysql原理以及相关优化

    说起MySQL的查询优化,相信大家积累一堆技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在 ...

随机推荐

  1. [转] 64位windows下添加postgreSQL odbc数据源

    系统环境:windows7 64位 postgreSQL9.0(64bit)   ps:安装postgreSQL时确定安装了odbc驱动.   问题:点击“开始->控制面板->管理工具-& ...

  2. soj 2013年 Nanjing Slection

    这样加边比STL快! 不明白为什么要+mod #include<iostream> #include<cstdio> #include<queue> #includ ...

  3. PHP控制输出不缓存头

    @header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); @header("Cache-Control: no-cache, ...

  4. PHP的ob_start()函数用法

    经典参考片段: <?php ob_start(); echo '123'; echo '456'; echo '789'; $content = ob_get_contents(); ob_en ...

  5. 06OC之内存管理

    在高级语言中,例如C#是通过垃圾回收机制(GC)来解决这个问题,但是在OC并没有类似的垃圾回收机制,因此必须由程序员手动去维护.今天就讲讲OC中的内存管理: 一.内存管理原理 在Xcode4.2之后的 ...

  6. 2016 GitHub章鱼猫观察报告之开源统计

    导读 GitHub 又发布了一年一度的章鱼猫观察报告.在这个报告中,分别对开源和社区做了一些有趣的统计,现将其中一些有趣的数据和趋势撷取出来分享给大家.完整的报告请移步Github. GitHub 上 ...

  7. Maven assembly 打包

    assembly .xml <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembl ...

  8. python——连接Oracle数据库

    前言 Python自带的模块中有很多操纵文件的.我们可以把文件的数据读出来,经过处理还可以将数据写入文件中.但是对于数据的管理和分析来说,数据库还是专业一些.如果Python能和数据库结合在一起,那么 ...

  9. C# FromBase64String 解码换行问题

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如 ...

  10. linux 用户创建、管理、权限分配

    (1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证: sudo: sudo扮 ...