本文实例讲述了删除MySQL重复数据的方法。分享给大家供大家参考。具体方法如下:
项目背景
在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据。因为在采集中,对于同一台设备,同一个时间点应该只有一个数据,然而,数据库中存入了多个数据。对于如何造成了这个结果,一时没有想清楚,但为了解决入库慢的问题,首先要删除冗余数据。
问题描述
数据库的表结构很简单,如下:
查询所有数据量
输出 427366
查询所有时间点不同设备的数据量
输出42387
由上面的数据可以看出,数据冗余了10倍左右。
再按时间分组看一下:
输出:
由上图可见,同一个时间点的同一个设备的数据有冗余,现在我们要把这些冗余数据去掉。
解决方法
思路是这样的:首先应该按照conf_id和时间点来判断,进行分组(group by)查询,每组中再取一个就可以。分组是很简单,但是分组怎么取一个呢?我采用了中间表的形式。
创建中间表,并把数据导入中间表
在中间表中增加一个字段,此字段是自增长的。
删除无用数据
先查询一下
删除不对的数据
慢着,输出错误:
You can’t specify target table ‘perf_linux_t’ for update in FROM clause
不能删除啊,那只能再建一个中间表了。
再建中间表
转变思路,不删除不符合的数据,而是把符合的数据存到这张新表中。
把这张表中的无用列删除
导回数据
删除原来的数据
插入数据
删除中间表
总结
通过这个方法,数据变为了42387条,删除了冗余的数据。但实际上程序的问题并没有完全定位,还需要观察才能定位问题。
希望本文所述对大家的mysql数据库程序设计有所帮助。