先叙述三张表的状况: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内。和几十年差的但是十万八千里。。。。。