刪除MySQL重復(fù)數(shù)據(jù)的方法
本文實(shí)例講述了刪除MySQL重復(fù)數(shù)據(jù)的方法。分享給大家供大家參考。具體方法如下:
項(xiàng)目背景
在最近做的一個(gè)linux性能采集項(xiàng)目中,發(fā)現(xiàn)線程的程序入庫很慢,再仔細(xì)定位,發(fā)現(xiàn)數(shù)據(jù)庫里面很多冗余數(shù)據(jù)。因?yàn)樵诓杉?,?duì)于同一臺(tái)設(shè)備,同一個(gè)時(shí)間點(diǎn)應(yīng)該只有一個(gè)數(shù)據(jù),然而,數(shù)據(jù)庫中存入了多個(gè)數(shù)據(jù)。對(duì)于如何造成了這個(gè)結(jié)果,一時(shí)沒有想清楚,但為了解決入庫慢的問題,首先要?jiǎng)h除冗余數(shù)據(jù)。
問題描述
數(shù)據(jù)庫的表結(jié)構(gòu)很簡(jiǎn)單,如下:
| 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 | |
+----------------+--------------+------+-----+---------+-------+
查詢所有數(shù)據(jù)量
輸出 427366
查詢所有時(shí)間點(diǎn)不同設(shè)備的數(shù)據(jù)量
輸出42387
由上面的數(shù)據(jù)可以看出,數(shù)據(jù)冗余了10倍左右。
再按時(shí)間分組看一下:
輸出:
| 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 |
+--------------------------------------+---------+---------------------+
由上圖可見,同一個(gè)時(shí)間點(diǎn)的同一個(gè)設(shè)備的數(shù)據(jù)有冗余,現(xiàn)在我們要把這些冗余數(shù)據(jù)去掉。
解決方法
思路是這樣的:首先應(yīng)該按照conf_id和時(shí)間點(diǎn)來判斷,進(jìn)行分組(group by)查詢,每組中再取一個(gè)就可以。分組是很簡(jiǎn)單,但是分組怎么取一個(gè)呢?我采用了中間表的形式。
創(chuàng)建中間表,并把數(shù)據(jù)導(dǎo)入中間表
insert into perf_linux_t select * from perf_linux;
在中間表中增加一個(gè)字段,此字段是自增長(zhǎng)的。
ADD COLUMN `auto_id` INT NOT NULL AUTO_INCREMENT ,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`auto_id`);
刪除無用數(shù)據(jù)
先查詢一下
刪除不對(duì)的數(shù)據(jù)
慢著,輸出錯(cuò)誤:
You can't specify target table 'perf_linux_t' for update in FROM clause
不能刪除啊,那只能再建一個(gè)中間表了。
再建中間表
轉(zhuǎn)變思路,不刪除不符合的數(shù)據(jù),而是把符合的數(shù)據(jù)存到這張新表中。
把這張表中的無用列刪除
DROP COLUMN `auto_id`,
DROP PRIMARY KEY;
導(dǎo)回?cái)?shù)據(jù)
刪除原來的數(shù)據(jù)
插入數(shù)據(jù)
刪除中間表
drop table perf_linux_t;
總結(jié)
通過這個(gè)方法,數(shù)據(jù)變?yōu)榱?2387條,刪除了冗余的數(shù)據(jù)。但實(shí)際上程序的問題并沒有完全定位,還需要觀察才能定位問題。
希望本文所述對(duì)大家的mysql數(shù)據(jù)庫程序設(shè)計(jì)有所幫助。
- mysql刪除重復(fù)記錄語句的方法
- MySQL中查詢、刪除重復(fù)記錄的方法大全
- mysql查找刪除重復(fù)數(shù)據(jù)并只保留一條實(shí)例詳解
- MySQL數(shù)據(jù)庫中刪除重復(fù)記錄的方法總結(jié)[推薦]
- mysql刪除表中某一字段重復(fù)的記錄
- mysql查找刪除表中重復(fù)數(shù)據(jù)方法總結(jié)
- mysql刪除重復(fù)行的實(shí)現(xiàn)方法
- MySQL中刪除重復(fù)數(shù)據(jù)的簡(jiǎn)單方法
- 刪除mysql數(shù)據(jù)庫中的重復(fù)數(shù)據(jù)記錄
- Mysql刪除重復(fù)數(shù)據(jù)通用SQL的兩種方法
相關(guān)文章
mySQL之關(guān)鍵字的執(zhí)行優(yōu)先級(jí)講解
這篇文章主要介紹了mySQL之關(guān)鍵字的執(zhí)行優(yōu)先級(jí)講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11MySQL數(shù)據(jù)庫 Load Data 多種用法
這篇文章主要介紹MySQL數(shù)據(jù)庫中 Load Data 數(shù)據(jù)的幾種種用法,需要的朋友可以參考下面文章的解說2021-08-08CentOS7環(huán)境下安裝MySQL5.5數(shù)據(jù)庫
大家好,本篇文章主要講的是CentOS7環(huán)境下安裝MySQL5.5數(shù)據(jù)庫,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Windows系統(tǒng)下mysql5.7.21安裝詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了Windows系統(tǒng)下mysql5.7.21安裝詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02php mysql insert into 結(jié)合詳解及實(shí)例代碼
在mysql中如果要保存數(shù)據(jù)到數(shù)據(jù)庫我們就會(huì)用到insert into命令了,下面我來給大家介紹mysql insert into幾種常用的使用方法,需要的朋友可以參考下2016-11-11windows 64位下mysql 8.0.13 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了windows 64位下mysql 8.0.13 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11mysql實(shí)現(xiàn)批量修改字段null值改為空字符串
這篇文章主要介紹了mysql實(shí)現(xiàn)批量修改字段null值改為空字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-08-08Mysql數(shù)據(jù)庫定時(shí)備份腳本分享
這篇文章主要分享了Mysql數(shù)據(jù)庫的定時(shí)備份腳本,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2020-09-09