删除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数据库程序有所帮助。