删除MySQL重复数据的方法

本文介绍了删除MySQL重复数据的方法,供大家参考,具体方法如下:

项目背景

在最近的Linux性能收集工程,发现线程的程序很慢,然后很仔细地查找数据库中大量的冗余数据。因为在收集装置,也应在同一时间点,只有一个数据,但是,许多数据存储在数据库中,它是不清楚如何造成的结果,但为了解决慢的存储问题,我们应该先删除冗余数据。

问题描述

数据库的表结构非常简单,如下所示:

复制代码如下:+ + + + ---------------- -------------- ------ ----- --------- ------- + + +

场型空| | | |关键|默认|额外|

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

| | ID varchar(255)没有空| | | | | PRI

| | conf_id varchar(255)没有多的空| | | | |

insert_time datetime是| | | | |空| |

| | cpu_usage浮(11)是| | |空| |

| | memory_usage浮(11)是| | |空| |

| | io_usage_write浮(11)是| | |空| |

| | io_usage_read浮(11)是| | |空| |

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

查询所有数据量

复制代码代码如下:select count(*)从perf_linux;

输出427366

在所有时间点查询不同设备的数据量

复制代码代码如下:select count(不同的conf_id,insert_time)从perf_linux;

输出42387

从上面的数据可以看出,数据大约是冗余的10倍。

看看时间。

复制代码代码如下:选择ID,conf_id,由insert_time perf_linux阶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和时间来判断,组(组)查询,每一个都可以接受。分组是很简单的,但如何把一组我用中间桌子的形式。

创建一个中间表并将数据导入到中间表中

复制代码代码如下:创建表perf_linux_t像perf_linux;

插入perf_linux_t SELECT * FROM perf_linux;

在中间表中添加一个字段,该字段是自增长的。

复制代码代码如下:修改表` perf_linux_t `

添加列` auto_id ` int不空auto_increment,

删除主键,

添加主键(` auto_id `);

删除无用的数据

先找它

复制代码代码如下:选择min(auto_id)作为auto_id从perf_linux_t组insert_time;

删除错误数据

代码复制代码如下:删除从perf_linux_t哪里auto_id没有(选择min(auto_id)作为auto_id);

等待,输出错误:

你不能指定目标table'perf_linux_t'for更新子句中

不能删除啊,那只能建立另一个中间表。

重建中表

复制代码代码如下:创建表像perf_linux_t TMP;

而不是删除不符合标准的数据,而不是保存存储在这个新表中的数据。

复制代码代码如下:插入TMP SELECT * FROM perf_linux_t auto_id在哪里(选择min(选择),而且它有两个要点。

删除表中无用的列

复制代码代码如下:修改表TMP

降柱` auto_id `,

删除主键;

导回数据

删除原始数据

The copy code code is as follows: truncate table perf_linux;

插入数据

复制代码代码如下:插入perf_linux SELECT * FROM TMP;

删除中间表

复制代码代码如下:下拉表TMP;

perf_linux_t表;

总结

该方法将数据分成42387条,删除冗余数据,但实际上程序的问题没有完全定位,需要进行观察才能找到问题所在。

希望本文能对大家设计mysql数据库程序有所帮助。