亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

刪除MySQL重復數據

系統 2164 0
原文: 刪除MySQL重復數據

刪除MySQL重復數據

項目背景

在最近做的一個linux性能采集項目中,發現線程的程序入庫很慢,再仔細定位,發現數據庫里面很多冗余數據。因為在采集中,對于同一臺設備,同一個時間點應該只有一個數據,然而,數據庫中存入了多個數據。對于如何造成了這個結果,一時沒有想清楚,但為了解決入庫慢的問題,首先要刪除冗余數據。

問題描述

數據庫的表結構很簡單,如下:


    
      +----------------+--------------+------+-----+---------+-------+

| Field          | Type         | Null | Key | Default | Extra |

+----------------+--------------+------+-----+---------+-------+

| id             | varchar(255) | NO   | PRI | NULL    |       |

| conf_id        | varchar(255) | NO   | MUL | NULL    |       |

| insert_time    | datetime     | YES  |     | NULL    |       |

| cpu_usage      | float(11,2)  | YES  |     | NULL    |       |

| memory_usage   | float(11,2)  | YES  |     | NULL    |       |

| io_usage_write | float(11,2)  | YES  |     | NULL    |       |

| io_usage_read  | float(11,2)  | YES  |     | NULL    |       |

+----------------+--------------+------+-----+---------+-------+
    
  

查詢所有數據量

    
      select count(*) from perf_linux;
    
  

輸出 427366

查詢所有時間點不同設備的數據量

    
      select count(distinct conf_id, insert_time) from perf_linux ;
    
  

輸出42387

由上面的數據可以看出,數據冗余了10倍左右。

再按時間分組看一下:

    
      select id, conf_id ,insert_time from perf_linux order by insert_time, conf_id;
    
  

輸出:

    
      | 2a79f7cd-43a9-4c7b-adb2-316b6c04283e | 1       | 2014-12-09 15:09:14 |

| 50d6f6c2-9c8b-45fd-98fd-2be211221cfd | 1       | 2014-12-09 15:09:14 |

| 740b52e1-e868-4074-ba36-74e2634401b3 | 1       | 2014-12-09 15:09:14 |

| 8b0096a4-9e85-417b-a131-e3505ca79a9c | 1       | 2014-12-09 15:09:14 |

| 90a9e882-5220-4508-a56f-8d4ab4a7929b | 1       | 2014-12-09 15:09:14 |

| d17403ed-24a4-45e8-b51b-2a95118383d9 | 1       | 2014-12-09 15:09:14 |

| 0c2da917-579b-4080-857d-7159f38b44ac | 2       | 2014-12-09 15:09:14 |

| 263083eb-8f63-4d2b-a03f-3320aa678735 | 2       | 2014-12-09 15:09:14 |

| d6c57a38-080b-465a-a55a-beafd9daf32d | 2       | 2014-12-09 15:09:14 |

| f672227b-1fb8-4b85-880d-2cc34b02880d | 2       | 2014-12-09 15:09:14 |

| f80020fe-6cb5-48ec-beb0-4e8ebeb0ca57 | 2       | 2014-12-09 15:09:14 |

| ff633a35-824d-49ba-b78c-5bcc5df8d1cc | 2       | 2014-12-09 15:09:14 |

| 5c41e48a-abfc-4108-a00e-ca7def7d5a5a | 3       | 2014-12-09 15:09:14 |

| 60b7ab9e-c91a-4020-a6d3-7bceb1dc47c5 | 3       | 2014-12-09 15:09:14 |

| 7b6cd2b8-ac6d-43eb-8858-e15885e676c8 | 3       | 2014-12-09 15:09:14 |

| d53a3df5-08c4-4604-8fac-cb51077935f6 | 3       | 2014-12-09 15:09:14 |

| d9e4ba14-f98d-42a8-b3bc-2879d58aa797 | 3       | 2014-12-09 15:09:14 |

| f56f82f6-32a7-47f7-ae07-b13168743884 | 3       | 2014-12-09 15:09:14 |

| 076c4c1b-0028-4a9c-a8c4-de655bd6ab6b | 4       | 2014-12-09 15:09:14 |

| 2a90ad9e-11a5-4707-95e8-78491da658ad | 4       | 2014-12-09 15:09:14 |

| 3b17ad1d-e589-4b65-93a7-d61fc99b4071 | 4       | 2014-12-09 15:09:14 |

| 6988d6cf-44ef-47f7-808d-09791caf2d90 | 4       | 2014-12-09 15:09:14 |

| 8404d281-f9e5-4153-a47e-128c05386758 | 4       | 2014-12-09 15:09:14 |

| e042e310-7ff2-4e4d-8c98-71e3e4d57828 | 4       | 2014-12-09 15:09:14 |

+--------------------------------------+---------+---------------------+
    
  

由上圖可見,同一個時間點的同一個設備的數據有冗余,現在我們要把這些冗余數據去掉。

解決方法

思路是這樣的:首先應該按照conf_id和時間點來判斷,進行分組(group by)查詢,每組中再取一個就可以。分組是很簡單,但是分組怎么取一個呢?我采用了中間表的形式。

創建中間表,并把數據導入中間表
    
      create table perf_linux_t like perf_linux;
    
  
    
      insert into perf_linux_t select * from perf_linux;
    
  
在中間表中增加一個字段,此字段是自增長的。
    
      ALTER TABLE `perf_linux_t` 

ADD COLUMN `auto_id` INT NOT NULL AUTO_INCREMENT ,

DROP PRIMARY KEY,

ADD PRIMARY KEY (`auto_id`);
    
  
刪除無用數據

先查詢一下

    
      select min(auto_id) as auto_id from perf_linux_t group by insert_time ;
    
  

刪除不對的數據

    
      delete  from perf_linux_t where auto_id not in (select min(auto_id) as auto_id from perf_linux_t group by insert_time);
    
  

慢著,輸出錯誤:

You can't specify target table 'perf_linux_t' for update in FROM clause

不能刪除啊,那只能再建一個中間表了。

再建中間表
    
      create table tmp like perf_linux_t;
    
  

轉變思路,不刪除不符合的數據,而是把符合的數據存到這張新表中。

    
      insert into tmp select * from perf_linux_t where auto_id in (select min(auto_id) as auto_id from perf_linux_t group by insert_time,conf_id );
    
  

把這張表中的無用列刪除

    
      ALTER TABLE `tmp` 

DROP COLUMN `auto_id`,

DROP PRIMARY KEY;
    
  
導回數據

刪除原來的數據

    
      truncate table perf_linux;
    
  

插入數據

    
      insert into perf_linux select * from tmp;
    
  

刪除中間表

    
      drop table tmp;
    
  
    
      drop table perf_linux_t;
    
  

總結

通過這個方法,數據變為了42387條,刪除了冗余的數據。但實際上程序的問題并沒有完全定位,還需要觀察才能定位問題。

而且我覺得我這個方法應該算比較土的方法,如果各位有更好的方式,希望不吝賜教。

參考:

mysql刪除重復記錄語句的方法

刪除MySQL重復數據


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品国产午夜伦班片 | 色综合久久综合网 | 久久九九99热这里只有精品 | 免费鲁丝片一级在线观看 | 91久久精品国产91性色tv | 久久高清影院 | 全免费午夜一级毛片真人 | 一本毛片 | 欧美国产精品日韩在线 | 国产欧美在线不卡 | 国产中文字幕免费 | 人人天天夜夜 | 一级午夜a毛片免费视频 | 久久影视一区 | 亚洲综合精品 | 麻豆精品久久久一区二区 | 欧美爱爱片 | 国产精品久久久久久久久久久威 | 免费人成黄页网站在线观看 | 特级黄色视频毛片 | 久久精品国产69国产精品亚洲 | 情趣色视频网站 | 天天干天天射天天操 | 在线国产一区 | 亚洲精品在线视频观看 | aa毛片免费全部播放完整 | 久久久亚洲欧洲日产国码二区 | 欧美精品日日鲁夜夜 | 欧美色欧美亚洲高清在线视频 | 手机在线一区二区三区 | 午夜欧美性欧美 | 在线亚洲精品国产成人二区 | 成人网在线看 | 国产精品九九九久久九九 | 久久网国产 | 国产福利91精品一区二区 | 日韩欧美中文字幕一区 | 波多野结衣三区 | 欧美性天天影院欧美狂野 | 色老板女色狠xx网 | 亚洲欧美一区在线 |