千萬級別mysql合併表快速去重

2021-08-26 21:49:25 字數 4033 閱讀 7359

現有表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)

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

建立中間表

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

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 | ****** | 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

mysql> drop table temp;

query ok, 0 rows affected (0.99 sec)

實際大約花費實際為:1 sec

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

分鐘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合併表快速去重

現有表a和b,把兩個表中的資料合併去重到c表中。其中a和b表中資料量大概在2千萬左右。作業系統版本 centos release 5.6 64位 作業系統記憶體 8g 資料庫版本 5.1.56 community 64位 資料庫初始化引數 預設 表a mysql desc a2kw field ty...

千萬級別mysql資料表優化

第一優化你的sql和索引 第二加快取,memcached,redis 第三以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四如果以上都做了還是慢,不要想著去做切分,mysql自帶分...

Mysql千萬級別資料優化方案 單錶

mysql千萬級別資料優化方案 目錄 目錄 1 一 目的與意義 2 1 說明 2 二 解決思路與根據 本測試表中資料在千萬級別 2 1 建立索引 2 2 資料體現 主鍵非索引,實際測試結果 其中fid 建立索引 2 3 mysql 分頁原理 2 4 經過實際測試當對表所有列查詢時 2 三 總結 3 ...