刪除MySQL反復數據的辦法。本站提示廣大學習愛好者:(刪除MySQL反復數據的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是刪除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數據庫法式設計有所贊助。
>rssparser.py
Mark Pilgrim 為 RSS 文件解析供給了另外一個模塊。它其實不供給 RSS.py 所供給的一切的功效部件和選項,但它卻供給了一個異常自在的解析器,它能很好的處置 RSS 世界中一切使人凌亂的差別。以下摘自 rssparser.py 頁面:
如您所見,年夜多半 RSS 供應都很蹩腳。有效的字符、未本義的 & 符號(Blogger 供應)、有效的實體(Radio 供應)和未本義和有效的 HTML(平日為注冊中間所供給的)。或許只是 RSS 0.9x 元素和 RSS 1.0 元素的一個籠統的混雜(可挪動類型供應(Movable Type feeds))。
還有很多太前沿的供應,就象 Aaron 的 feed。他將一個摘錄放入描寫元素中而將完全的文本放入 content:encoded 元素中(象 CDATA)。這是一個有用的 RSS 1.0,但沒有人回真正應用它(除 Aaron),簡直沒有消息集合器支撐它,而且很多解析器還排擠它。其他解析器被 RSS 0.94 中的新元素(guid)所迷惑(請參閱 Dave Winer 的供應作為一個示例)。還有 Jon Udell 的供應,個中還有他才從創作中遴選出來的 fullitem 元素。
XML 和 Web 辦事會增長互操作性簡直已成定局,所以如許斟酌其實很好笑。不管若何,設計 rssparser.py 目標就是要處置一切這些荒謬的情形。
裝置 rssparser.py 也非常簡略。請您下載 Python 文件(參閱參考材料),將“rssparser.py.txt”重定名為 “rssparser.py”,並將它復制到您的 PYTHONPATH 中。我異樣建議您獲得可選的 timeoutsocket 模塊,它可以改良 Python 中的套接字操作的超時行動,如許有助於獲得 RSS feeds 而不用為了避免毛病就停滯運用法式線程。
清單 3是一個同等於 清單 1的劇本,但它應用了 rssparser.py,而不是 RSS.py。
清單 3:應用一個簡略的 rssparser.py 演習
import rssparser #Parse the data, returns a tuple: (data for channels, data for items) channel, items = rssparser.parse("http://www.python.org/channews.rdf") for item in items: #Each item is a dictionary mapping properties to values print "RSS Item:", item.get('link', "(none)") print "Title:", item.get('title', "(none)") print "Description:", item.get('description', "(none)")
如您所見,這段代碼異常簡略。RSS.py 和 rssparser.py 不克不及相互代替在很年夜水平上是由於前者有更多的功效部件,而且保護著 RSS 供應中更多的語法信息。後者更簡略,而且是一個容錯才能更強的解析器(RSS.py 解析器只能接收格局優越的 XML)。
它的輸入應當與 清單 2中的輸入雷同。