从 MySQL 中的大 table 中删除重复项的最快过程是什么
What is the fastest procedure to remove duplicates from a big table in MySQL
我在 MySQL 中有一个 table(5000 万行)新数据不断插入。
此 table 具有以下结构
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 次插入。
防止以后重复:
- 将
KEY channel_date_index (channel_id,date_time)
更改为UNIQUE (channel_id,date_time)
- 将
INSERT
更改为 INSERT ... ON DUPLICATE KEY UPDATE ...
以在该对存在时更改时间戳。
要修复现有的 table,您可以 ALTER IGNORE TABLE ... ADD UNIQUE(...)
。但是,这不会为您提供最新的时间戳。
为了最短停机时间(不是最大速度),请使用 pt-online-schema-change。
我在 MySQL 中有一个 table(5000 万行)新数据不断插入。
此 table 具有以下结构
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 次插入。
防止以后重复:
- 将
KEY channel_date_index (channel_id,date_time)
更改为UNIQUE (channel_id,date_time)
- 将
INSERT
更改为INSERT ... ON DUPLICATE KEY UPDATE ...
以在该对存在时更改时间戳。
要修复现有的 table,您可以 ALTER IGNORE TABLE ... ADD UNIQUE(...)
。但是,这不会为您提供最新的时间戳。
为了最短停机时间(不是最大速度),请使用 pt-online-schema-change。