MySQL 删除/内连接性能
MySQL Delete / Inner Join performance
我有一个 MySQL 数据库,其中一个表(分析)中有大约 2700 万行。我用语句
索引了两个变量,时间和 ID
ALTER TABLE `analyses` ADD INDEX(`time`);
ALTER TABLE `analyses` ADD INDEX(`ID`);
每个陈述大约需要 4 分钟。
然后我尝试使用语句
删除多余的行
DELETE a1 FROM analyses a1 INNER JOIN analyses a2 WHERE a1.log_id > a2.log_id
AND a1.ID= a2.ID AND a1.time=a2.time;
这条语句已经执行了 ~2 天没有出错。
- 有什么方法可以估计这个声明需要多长时间?
- 据我了解,中断此进程(ctrl-C 或 kill)不会损坏数据库;这样做是安全的吗?
- 有什么方法可以制定 DELETE 语句来提高执行速度,还是我应该等待这个过程完成?
好吧,为了好玩,您可以尝试创建一个新的 table,其中只包含您想要保留的记录...
首先摆脱你现有的索引,而是在 (id,time) 上创建一个复合索引。
然后这样做...
CREATE TABLE my_new_table AS
SELECT x.*
FROM analyses x
JOIN
( SELECT id
, time
, MAX(log_id) log_id
FROM analyses
GROUP
BY id
, time
) y
ON y.ID = x.ID
AND y.time = x.time
AND y.log_id = x.log_id;
我有一个 MySQL 数据库,其中一个表(分析)中有大约 2700 万行。我用语句
索引了两个变量,时间和 IDALTER TABLE `analyses` ADD INDEX(`time`);
ALTER TABLE `analyses` ADD INDEX(`ID`);
每个陈述大约需要 4 分钟。 然后我尝试使用语句
删除多余的行DELETE a1 FROM analyses a1 INNER JOIN analyses a2 WHERE a1.log_id > a2.log_id
AND a1.ID= a2.ID AND a1.time=a2.time;
这条语句已经执行了 ~2 天没有出错。
- 有什么方法可以估计这个声明需要多长时间?
- 据我了解,中断此进程(ctrl-C 或 kill)不会损坏数据库;这样做是安全的吗?
- 有什么方法可以制定 DELETE 语句来提高执行速度,还是我应该等待这个过程完成?
好吧,为了好玩,您可以尝试创建一个新的 table,其中只包含您想要保留的记录...
首先摆脱你现有的索引,而是在 (id,time) 上创建一个复合索引。
然后这样做...
CREATE TABLE my_new_table AS
SELECT x.*
FROM analyses x
JOIN
( SELECT id
, time
, MAX(log_id) log_id
FROM analyses
GROUP
BY id
, time
) y
ON y.ID = x.ID
AND y.time = x.time
AND y.log_id = x.log_id;