共计 3920 个字符,预计需要花费 10 分钟才能阅读完成。
这期内容当中丸趣 TV 小编将会给大家带来有关 mysql 中怎么合并表,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
mysql 合并表去重
目标:
现有表 a 和 b,把两个表中的数据合并去重到 c 表中。其中 a 和 b 表中数据量大概在 2 千万左右。
基本情况
操作系统版本:CentOS release 5.6 64 位
操作系统内存:8G
版本:5.1.56-community 64 位
数据库初始化参数:默认
数据库表和数据量
表 a: www.2cto.com
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)
基本步骤 www.2cto.com
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
www.2cto.com
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 | |
+—-+————-+——-+ www.2cto.com ——-+—————+——–
——-+———+——+———-+——-+
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 分钟 www.2cto.com
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)
上述就是丸趣 TV 小编为大家分享的 mysql 中怎么合并表了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。