mysql数据去除重复及相关优化(转)
由于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数据去除重复及相关优化(转)的更多相关文章
- MySql数据表设计,索引优化,SQL优化,其他数据库
MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...
- mysql数据库去除重复数据
(一)最原始的方法: delete from test where id not in (select * from ((select min(id) from test group by(name) ...
- mysql锁表机制及相关优化
(该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...
- mysql中去除重复字段-distinct
1.注意事项 使用distinct命令时需要放在查询条件的开头,否则会报错.如果需要查询的项目很多但只针对某一个字段使用distinct的,则可以利用内容拼接的方式来实现. --基本查询 SELECT ...
- mysql数据去重复distinct、group by
使用distinct 和group by都可以实现数据去重. select distinct 字段 group by 一般放在where条件后
- oracle 相关查询和非相关查询,oracle 去除重复数据,以及oracle的分页查询!
一.oracle中的相关查询?和非相关查询? 二.oracle去除重复数据 1. 2. 3.oracle 实现分页? 利用rownum的唯一性,和子查询,将rownum从伪列变成实际列!
- mysql 去除重复数据
1. 问题描述 有时load或者insert操作导致 表数据有重复 2. 解决方案 通过临时表.主键id.倒腾去重 示例 2.1 create table student( name varchar ...
- Mysql数据优化--DBA梳理珍藏篇
1. 优化SQL 1) 通过show status了解各种sql的执行频率 show status like 'Com_%' 了解 Com_select,Com_insert 的 ...
- mysql原理以及相关优化
说起MySQL的查询优化,相信大家积累一堆技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在 ...
随机推荐
- [Web开发] 在HTML代码里面如何判断IE版本
在上一篇blog里面提到IE有不同的显示模式以及如何用Javascript 来动态判定. Web开发者可以根据不同显示模式导入不同的内容.这篇blog 主要讲如何让静态HTML代码根据不同IE版本显示 ...
- JS各种方法
一.JS(去掉前后空格或去掉所有空格)的用法 1.去掉字符串前后所有空格:代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ...
- 大熊君大话NodeJS之 ------ Connect中间件第二季(源码分析)
一,开篇分析 大家好,大熊君又回来了,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,做一个源码分析系列,我想上一篇文章大家也看了, 介绍了使用方式及用途,而这篇也 ...
- iOS中常用属性的关键字的使用说明
属性关键字的作用 现在我们iOS开发中,基本都是使用ARC(自动引用计数)技术,来编写我们的代码.因此在属性property中我们经常使用的关键字有strong,weak,assign,copy,no ...
- HQL常用的查询语句
摘录自某人,比较有用,比较全. // HQL: Hibernate Query Language. // 特点: // >> 1,与SQL相似,SQL中的语法基本上都可以直接使用. // ...
- 相同根域名下跨域共享session的解决方案
https://code.msdn.microsoft.com/CSASPNETShareSessionBetween-021daa39
- 提高MYSQL百万条数据的查询速度
提高MYSQL百万条数据的查询速度 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 nul ...
- Java四种线程池的使用
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- python __call__ 内置函数的使用
对象通过提供__call__(slef, [,*args [,**kwargs]])方法可以模拟函数的行为, 如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2... ...
- senlin __init__() got an unexpected keyword argument 'additional_headers'
从senlin源码重新编译更新了服务,然后执行 senlin的 cli就遇到了错误: __init__() got an unexpected keyword argument 'additional ...