从 MySQL 中的大表中删除重复项的最快过程是啥

Posted

技术标签:

【中文标题】从 MySQL 中的大表中删除重复项的最快过程是啥【英文标题】:What is the fastest procedure to remove duplicates from a big table in MySQL从 MySQL 中的大表中删除重复项的最快过程是什么 【发布时间】:2015-03-30 15:58:29 【问题描述】:

我在 mysql 中有一个表(5000 万行),新数据会定期插入。

此表具有以下结构

CREATE TABLE values (
    id double NOT NULL AUTO_INCREMENT,
    channel_id int(11) NOT NULL,
    val text NOT NULL,
    date_time datetime NOT NULL,
    PRIMARY KEY (id),
    KEY channel_date_index (channel_id,date_time)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

两行不能有重复的channel_id和date_time,但如果发生这样的插入,保持最新的值很重要。

是否有程序在插入之前实时检查重复项,或者我是否应该继续插入所有数据,同时在不同的周期中定期检查重复项。

在这里实时速度很重要,因为每秒发生 100 次插入。

【问题讨论】:

如果您的表有 50m 行并且每秒有 100 次插入,那么它的使用时间不到 6 天...如果您在 channel_id, date_time 上创建唯一索引,则执行 upsert 而不是向表中添加数据时的插入,你不应该有欺骗。 正如@Ben 所说,使用主键和唯一索引是一种非常更好的方法。该表将彻底拒绝任何重复项,因此这是不可能的。您只需要花时间向尝试输入重复数据的用户发送良好的安全错误消息即可。 【参考方案1】:

为了防止未来重复:

    KEY channel_date_index (channel_id,date_time) 更改为UNIQUE (channel_id,date_time)INSERT 更改为INSERT ... ON DUPLICATE KEY UPDATE ... 以更改该对存在时的时间戳

要修复现有表,您可以执行ALTER IGNORE TABLE ... ADD UNIQUE(...)。但是,这不会为您提供最新的时间戳。

对于最短停机时间(不是最高速度),请使用 pt-online-schema-change。

【讨论】:

另见***.com/questions/29334624/…

以上是关于从 MySQL 中的大表中删除重复项的最快过程是啥的主要内容,如果未能解决你的问题,请参考以下文章

从mysql中的大表中快速选择随机行

从具有 NULL 列的大表中删除重复项,这也需要考虑

从 SQL Server 中的大表中删除大部分数据的策略

获取数组第一项的最快方法是啥? [复制]

在 Access DB 中删除重复项的最快方法

删除两个 MySQL 大表中的匹配记录