吐血的一次sql去重查询经历

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

相关文章
相关标签/搜索