先敘述三張表的狀況:mysql
ic表:sql
Create Table CREATE TABLE `ic` ( `uuid` varchar(100) DEFAULT NULL, `Businname` varchar(500) DEFAULT NULL, `memberlevel` varchar(500) DEFAULT NULL, `retrievalmodel` varchar(500) DEFAULT NULL, `Memberyears` varchar(500) DEFAULT NULL, `mobnum` varchar(500) DEFAULT NULL, `address` varchar(500) DEFAULT NULL, `pagesize` varchar(500) DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8
icnum:數據庫
Create Table CREATE TABLE `icnum` ( `uuid` varchar(500) DEFAULT NULL, `conname` varchar(500) DEFAULT NULL, `connum` varchar(500) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
icqq:ui
Create Table CREATE TABLE `icqq` ( `uuid` varchar(100) DEFAULT NULL, `qq` varchar(500) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
這三張表原來放入的時候是不進行查重,有數據就放裏面。因此除了uuid不同,其它字段都是能夠重複的。並且,每張表的記錄已經超過50wan以上了。因此簡單的使用distinct估計須要幾十年。。。。。。。。。excel
select distinct `ic`.`Businname` AS `Businname`, `ic`.`mobnum` AS `mobnum`, `ic`.`retrievalmodel` AS `retrievalmodel`, `icqq`.`qq` AS `qq`, `icnum`.`connum` AS `connum`, `icnum`.`conname` AS `conname`, `ic`.`address` AS `address` from ((`ic` join `icnum`) join `icqq`) where ((`ic`.`uuid` = `icnum`.`uuid`) and (`ic`.`uuid` = `icqq`.`uuid`)))
數據的特色就是,每張表除了uuid,其他字段都是重複的,並且每張表都是經過uuid進行關聯。uuid同樣,便可視爲對應數據。並且,ic.uuid對應多條icnum.uuid,icqq.uuid的數據,即icnum,icqq的uuid是能夠重複的。code
而後,好戲能夠開場了:class
第一步:select
我使用excel連接mysql,鏈接數據庫的digi用excel先根據公司名去重,保留uuid。model
第二步:遍歷
而後導入到mysql中的臨時表 tempic:
Create Table CREATE TABLE `tempic` ( `uuid` varchar(255) DEFAULT NULL, `Businname` varchar(255) DEFAULT NULL, `memberlevel` varchar(255) DEFAULT NULL, `retrievalmodel` varchar(255) DEFAULT NULL, `Memberyears` varchar(255) DEFAULT NULL, `mobnum` varchar(255) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `pagesize` varchar(255) DEFAULT NULL, UNIQUE KEY `uuid` (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
第三步:
建立臨時表tempicnum:
Create Table CREATE TABLE `tempicnum` ( `uuid` varchar(500) DEFAULT NULL, `conname` varchar(500) DEFAULT NULL, `connum` varchar(500) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
根據tempic的uuid:
INSERT INTO tempic (Businname,mobnum, retrievalmodel, connum,conname, address) SELECT tempic.`Businname`,tempic.`mobnum`, tempic.`retrievalmodel`, tempicnum.`connum`,tempicnum.`conname`, tempic.`address` FROM tempic,tempicnum WHERE tempic.`uuid` = tempicnum.`uuid`
這樣就把數據提取出來了。僅僅這一步是50萬條*50萬僅僅1s內。。。。。
對於這一步原來我想着是使用tempic的uuid進行刪除 即:
DELETE FROM icnum WHERE UUID NOT IN (SELECT UUID FROM tempic)
但是,這樣用時也長。。。。。。
假如,tempic篩選出5000條不重複的數據,則對於icnum的50萬條數據進行遍歷,每次遍歷都須要去5000條信息裏面查一次,並且delete須要打log。。。。。因此放棄
同理,三表聯查也能夠縮短至10s內。和幾十年差的但是十萬八千里。。。。。