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 天没有出错。

  1. 有什么方法可以估计这个声明需要多长时间?
  2. 据我了解,中断此进程(ctrl-C 或 kill)不会损坏数据库;这样做是安全的吗?
  3. 有什么方法可以制定 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;