程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 刪除MySQL反復數據的辦法

刪除MySQL反復數據的辦法

編輯:MySQL綜合教程

刪除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數據庫法式設計有所贊助。

>
成果是一個打印輸入的 RSS 1.0 文檔。為了它能任務您必需有 RSS.py,版本 0.42 或許更高的版本。較早版本中的 output() 辦法中有一個毛病。

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中的輸入雷同。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved