吐血的一次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內。和幾十年差的但是十萬八千里。。。。。

相關文章
相關標籤/搜索