mysql合并表去重
目标:
现有表a和b,把两个表中的数据合并去重到c表中。其中a和b表中数据量大概在2千万左右。
基本情况
操作系统版本:CentOS release 5.6 64位
操作系统内存:8G
数据库版本:5.1.56-community 64位
数据库初始化参数:默认
数据库表和数据量
表a:
mysql> desc a2kw;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | varchar(20) | YES | MUL | NULL | |
| c2 | varchar(30) | YES | | NULL | |
| c3 | varchar(12) | YES | | NULL | |
| c4 | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
|
表b
mysql> desc b2kw;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | varchar(20) | YES | | NULL | |
| c2 | varchar(30) | YES | | NULL | |
| c3 | varchar(12) | YES | | NULL | |
| c4 | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
|
a和b表的数据概况如下
mysql> select * from a2kw limit 10;
+-----------+-----------+------+----------+
| c1 | c2 | c3 | c4 |
+-----------+-----------+------+----------+
| 662164461 | 131545534 | TOM0 | 20120520 |
| 226662142 | 605685564 | TOM0 | 20120516 |
| 527008225 | 172557633 | TOM0 | 20120514 |
| 574408183 | 350897450 | TOM0 | 20120510 |
| 781619324 | 583989494 | TOM0 | 20120510 |
| 158872754 | 775676430 | TOM0 | 20120512 |
| 815875622 | 631631832 | TOM0 | 20120514 |
| 905943640 | 477433083 | TOM0 | 20120514 |
| 660790641 | 616774715 | TOM0 | 20120512 |
| 999083595 | 953186525 | TOM0 | 20120513 |
+-----------+-----------+------+----------+
10 rows in set (0.01 sec)
|
基本步骤
1、在B表上创建索引
mysql> select count(*) from b2kw;
+----------+
| count(*) |
+----------+
| 20000002 |
+----------+
1 row in set (0.00 sec)
mysql> create index ind_b2kw_c1 on b2kw(c1);
Query OK, 20000002 rows affected (1 min 2.94 sec)
Records: 20000002 Duplicates: 0 Warnings: 0
|
数据量为:20000002 ,时间为:1 min 2.94 sec
2、把a、b分别插入中间表temp表中
创建中间表
mysql> create table temp select * from c2kw where 1=2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
插入数据
mysql> insert into temp select * from a2kw;
Query OK, 20000002 rows affected (13.23 sec)
Records: 20000002 Duplicates: 0 Warnings: 0
mysql> insert into temp select * from b2kw;
Query OK, 20000002 rows affected (13.27 sec)
Records: 20000002 Duplicates: 0 Warnings: 0
mysql> select count(*) from temp;
+----------+
| count(*) |
+----------+
| 40000004 |
+----------+
1 row in set (0.00 sec)
|
数据量为:40000004 ,时间为:26.50 sec
3、temp建立联合索引,强制索引去掉重复数据
mysql> create index ind_temp_c123 on temp(c1,c2,c3);
Query OK, 40000004 rows affected (3 min 43.87 sec)
Records: 40000004 Duplicates: 0 Warnings: 0
查看执行计划
mysql> explain select c1,c2,c3,max(c4) from temp FORCE INDEX (ind_temp_c123) group by c1,c2,c3 ;
+----+-------------+-------+-------+---------------+---------------+---------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------------+---------+------+----------+-------+
| 1 | SIMPLE | temp | index | NULL | ind_temp_c123 | 71 | NULL | 40000004 | |
+----+-------------+-------+-------+---------------+---------------+---------+------+----------+-------+
1 row in set (0.05 sec)
mysql> insert into c2kw select c1,c2,c3,max(c4) from temp FORCE INDEX (ind_temp_c123) group by c1,c2,c3 ;
Query OK, 20000004 rows affected (2 min 0.85 sec)
Records: 20000004 Duplicates: 0 Warnings: 0
|
实际大约花费实际为:6 min
4、删除中间表
mysql> drop table temp;
Query OK, 0 rows affected (0.99 sec)
|
实际大约花费实际为:1 sec
5、建立c索引
mysql> create index ind_c2kw_c1 on c2kw(c1);
Query OK, 20000004 rows affected (49.74 sec)
Records: 20000004 Duplicates: 0 Warnings: 0
mysql> create index ind_c2kw_c2 on c2kw(c2);
Query OK, 20000004 rows affected (1 min 47.20 sec)
Records: 20000004 Duplicates: 0 Warnings: 0
mysql> create index ind_c2kw_c3 on c2kw(c3);
Query OK, 20000004 rows affected (2 min 42.02 sec)
Records: 20000004 Duplicates: 0 Warnings: 0
|
实际大约花费实际为:5分钟
6、清空a、b表
mysql> truncate table a2kw;
Query OK, 0 rows affected (1.15 sec)
mysql> truncate table b2kw;
Query OK, 0 rows affected (1.34 sec)
|
实际大约花费实际为:3sec
一共花费的时间大概在15分钟左右
分享到:
相关推荐
主要给大家介绍了关于MySQL数据表合并去重的简单实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
千万数据,方便测试,sql调优
1.Merge(MRG_MyISAM)存储引擎类型允许你把许多结构相同的表合并为一个表。当从合并表中执行查询,从多个表返回的结果就像从一个表返回的结果一样。 2.要创建合并表的前提是每一个合并的表必须有同样的表定义(表结构...
mysql去重查询的三种方法:文章通过本人的真实测试,以图文并茂的方式实现了mysql数据库去重查询的三种方式。包含mysql常用的使用distinct剔重、使用group by提重、使用开窗函数row_number()或类row_number()方法。...
主要介绍了MySQL 数据查重、去重的实现语句,帮助大家更好的理解和学习MySQL数据库,感兴趣的朋友可以了解下
•问题提出 ...2.要把去重后的50万数据写入到目标表。 3.重复created_time和item_name的多条数据,可以保留任意一条,不做规则限制。 •实验环境 Linux虚机:CentOS release 6.4;8G物理内存(MySQL配置4G)
Oracle导Mysql适用于百、千万级别数据迁移,速度是kettle的10倍以上数据库迁移 数据迁移 千万级 亿万级数据,MySQL oracle关系型 现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库...
主要介绍了mysql去重的两种方法详解及实例代码的相关资料,这里对去重的两种方法进行了一一实例详解,需要的朋友可以参考下
sql语句:按照某一个字段进行去重后获取全部字段。
主要涉及:JOIN 、JOIN 更新、GROUP BY HAVING 数据查重/去重 1 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN(MySQL 不支持)、CROSS JOIN 这是在网上找到的非常好的一篇博文,图解 join 语句: CODING HORROR-A ...
mysql代码-distinct去重
千万级Mysql-MongoDB性能对比报告
mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据
支持导出MySQL数据库表结构!! 运行环境:jdk8+,需要Java运行环境 执行命令:java -jar data_to_word-1.0-SNAPSHOT.jar
45-MySQL单表2000万数据查询慢解决方案1
Mysql千万级别数据优化方案