欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

刪除MySQL重復(fù)數(shù)據(jù)的方法

 更新時(shí)間:2014年12月18日 09:36:39   投稿:shichen2014  
這篇文章主要介紹了刪除MySQL重復(fù)數(shù)據(jù)的方法,通過(guò)建立中間表實(shí)現(xiàn)針對(duì)冗余數(shù)據(jù)的刪除功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了刪除MySQL重復(fù)數(shù)據(jù)的方法。分享給大家供大家參考。具體方法如下:

項(xiàng)目背景

在最近做的一個(gè)linux性能采集項(xiàng)目中,發(fā)現(xiàn)線程的程序入庫(kù)很慢,再仔細(xì)定位,發(fā)現(xiàn)數(shù)據(jù)庫(kù)里面很多冗余數(shù)據(jù)。因?yàn)樵诓杉校瑢?duì)于同一臺(tái)設(shè)備,同一個(gè)時(shí)間點(diǎn)應(yīng)該只有一個(gè)數(shù)據(jù),然而,數(shù)據(jù)庫(kù)中存入了多個(gè)數(shù)據(jù)。對(duì)于如何造成了這個(gè)結(jié)果,一時(shí)沒(méi)有想清楚,但為了解決入庫(kù)慢的問(wèn)題,首先要?jiǎng)h除冗余數(shù)據(jù)。

問(wèn)題描述

數(shù)據(jù)庫(kù)的表結(jié)構(gòu)很簡(jiǎn)單,如下:

復(fù)制代碼 代碼如下:
+----------------+--------------+------+-----+---------+-------+
| 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ù)量
復(fù)制代碼 代碼如下:
select count(*) from perf_linux;

輸出 427366

查詢所有時(shí)間點(diǎn)不同設(shè)備的數(shù)據(jù)量

復(fù)制代碼 代碼如下:
select count(distinct conf_id, insert_time) from perf_linux ;

輸出42387

由上面的數(shù)據(jù)可以看出,數(shù)據(jù)冗余了10倍左右。

再按時(shí)間分組看一下:

復(fù)制代碼 代碼如下:
select id, conf_id ,insert_time from perf_linux order by insert_time, conf_id;

輸出:
復(fù)制代碼 代碼如下:
| 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 |
+--------------------------------------+---------+---------------------+

由上圖可見(jiàn),同一個(gè)時(shí)間點(diǎn)的同一個(gè)設(shè)備的數(shù)據(jù)有冗余,現(xiàn)在我們要把這些冗余數(shù)據(jù)去掉。

解決方法

思路是這樣的:首先應(yīng)該按照conf_id和時(shí)間點(diǎn)來(lái)判斷,進(jìn)行分組(group by)查詢,每組中再取一個(gè)就可以。分組是很簡(jiǎn)單,但是分組怎么取一個(gè)呢?我采用了中間表的形式。

創(chuàng)建中間表,并把數(shù)據(jù)導(dǎo)入中間表

復(fù)制代碼 代碼如下:
create table perf_linux_t like perf_linux;
insert into perf_linux_t select * from perf_linux;

在中間表中增加一個(gè)字段,此字段是自增長(zhǎng)的。
復(fù)制代碼 代碼如下:
ALTER TABLE `perf_linux_t`
ADD COLUMN `auto_id` INT NOT NULL AUTO_INCREMENT ,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`auto_id`);

刪除無(wú)用數(shù)據(jù)

先查詢一下

復(fù)制代碼 代碼如下:
select min(auto_id) as auto_id from perf_linux_t group by insert_time ;

刪除不對(duì)的數(shù)據(jù)
復(fù)制代碼 代碼如下:
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);

慢著,輸出錯(cuò)誤:

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

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

再建中間表

復(fù)制代碼 代碼如下:
create table tmp like perf_linux_t;

轉(zhuǎn)變思路,不刪除不符合的數(shù)據(jù),而是把符合的數(shù)據(jù)存到這張新表中。
復(fù)制代碼 代碼如下:
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 );

把這張表中的無(wú)用列刪除
復(fù)制代碼 代碼如下:
ALTER TABLE `tmp`
DROP COLUMN `auto_id`,
DROP PRIMARY KEY;

導(dǎo)回?cái)?shù)據(jù)

刪除原來(lái)的數(shù)據(jù)

復(fù)制代碼 代碼如下:
truncate table perf_linux;

插入數(shù)據(jù)
復(fù)制代碼 代碼如下:
insert into perf_linux select * from tmp;

刪除中間表
復(fù)制代碼 代碼如下:
drop table tmp;
drop table perf_linux_t;

總結(jié)

通過(guò)這個(gè)方法,數(shù)據(jù)變?yōu)榱?2387條,刪除了冗余的數(shù)據(jù)。但實(shí)際上程序的問(wèn)題并沒(méi)有完全定位,還需要觀察才能定位問(wèn)題。

希望本文所述對(duì)大家的mysql數(shù)據(jù)庫(kù)程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 一文帶你搞懂MySQL的MVCC機(jī)制

    一文帶你搞懂MySQL的MVCC機(jī)制

    MySQL中的MVCC機(jī)制想必大家都有所耳聞吧,雖然在平時(shí)MySQL使用過(guò)程中基本上用不到,但是面試中出場(chǎng)率十分高,那么你對(duì)MVCC機(jī)制了解多少呢,MVCC機(jī)制是用來(lái)干嘛的呢,底層的工作原理是怎么樣的呢,本文就帶你一探究竟
    2023-07-07
  • Mysql join聯(lián)表及id自增實(shí)例解析

    Mysql join聯(lián)表及id自增實(shí)例解析

    這篇文章主要介紹了Mysql join聯(lián)表及id自增實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • MySQL如何解決DOS窗口亂碼問(wèn)題

    MySQL如何解決DOS窗口亂碼問(wèn)題

    這篇文章主要介紹了MySQL如何解決DOS窗口亂碼問(wèn)題,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-11-11
  • mysql中Innodb 行鎖實(shí)現(xiàn)原理

    mysql中Innodb 行鎖實(shí)現(xiàn)原理

    InnoDB的行鎖是通過(guò)索引項(xiàng)加鎖實(shí)現(xiàn)的,分為使用索引和非索引字段檢索的情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • MySQL使用UNIQUE實(shí)現(xiàn)數(shù)據(jù)不重復(fù)插入

    MySQL使用UNIQUE實(shí)現(xiàn)數(shù)據(jù)不重復(fù)插入

    當(dāng)unique列在一個(gè)UNIQUE鍵上插入包含重復(fù)值的記錄時(shí),我們可以控制MySQL如何處理這種情況:使用IGNORE關(guān)鍵字或者ON DUPLICATE KEY UPDATE子句跳過(guò)INSERT、中斷操作或者更新舊記錄為新值。
    2017-05-05
  • MySQL 用戶管理和數(shù)據(jù)庫(kù)權(quán)限問(wèn)題

    MySQL 用戶管理和數(shù)據(jù)庫(kù)權(quán)限問(wèn)題

    MySQL作為世界上最流行的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù),在實(shí)際生產(chǎn)環(huán)境中,合理的用戶管理和權(quán)限控制是確保數(shù)據(jù)安全的重要基石,本文將從零開(kāi)始,手把手教你掌握MySQL的用戶管理和權(quán)限控制,感興趣的朋友一起看看吧
    2025-06-06
  • MySQL中空值和NULL的區(qū)別小結(jié)

    MySQL中空值和NULL的區(qū)別小結(jié)

    在 MySQL 中,NULL 值和空值是兩個(gè)不同的概念,本文主要介紹了MySQL中空值和NULL的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • MySQL 存儲(chǔ)過(guò)程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法

    MySQL 存儲(chǔ)過(guò)程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法

    這篇文章主要介紹了MySQL 存儲(chǔ)過(guò)程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法,需要的朋友可以參考下
    2014-08-08
  • MySQL在關(guān)聯(lián)復(fù)雜情況下所能做出的一些優(yōu)化

    MySQL在關(guān)聯(lián)復(fù)雜情況下所能做出的一些優(yōu)化

    這篇文章主要介紹了MySQL在關(guān)聯(lián)復(fù)雜情況下所能做出的一些優(yōu)化,作者通過(guò)添加索引來(lái)不斷優(yōu)化查詢時(shí)間,需要的朋友可以參考下
    2015-05-05
  • 基于Mysql+JavaSwing的超市商品管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    基于Mysql+JavaSwing的超市商品管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    本項(xiàng)目是使用Java swing開(kāi)發(fā),可實(shí)現(xiàn)超市管理系統(tǒng)商品列表信息查詢、添加商品信息和修改商品管理以及刪除商品信息和安裝商品信息查詢等功能。界面設(shè)計(jì)和功能比較簡(jiǎn)單基礎(chǔ)、適合作為Java課設(shè)設(shè)計(jì)以及學(xué)習(xí)技術(shù)使用,需要的朋友可以參考一下
    2021-09-09

最新評(píng)論