在MySQL上加快删除重复项命令

问题描述

我有一个这样的表t1:

id     |   abstract_text |
1      | long paragraph1 |
2      | long paragraph2 |
3      | long paragraph1 |

它具有大约150,000个唯一ID,但是某些ID具有相同的abstract_text值(例如1和3)。

我正在使用此命令

delete t1 from t1 
inner join t1 t2 
where
    t1.application_id < t2.application_id AND
    t1.abstract_text=t2.abstract_text;

但是,已经超过2个小时,并且尚未完成运行。 abstract_texts是很长的段落,所以我知道它不会很快。我尝试创建索引,但是由于不能使用abstract_text b / c创建索引而太长(抛出ER_TOO_LONG_KEY: Specified key was too long; max key length is 3072 bytes错误),因此我不确定如何使用该索引。

有什么方法可以加快这一过程?

解决方法

删除操作对于数据库来说是一个昂贵的过程,您可以选择创建一个新表,在该表中删除重复的段落,

CREATE TABLE t3 AS
SELECT t1.application_id,t1.abstract_text
  FROM t1 
  JOIN t1 t2
 WHERE t1.application_id > t2.application_id 
   AND t1.abstract_text=t2.abstract_text
UNION ALL
SELECT MAX(application_id) AS application_id,abstract_text
  FROM t1 
 GROUP BY abstract_text
 HAVING COUNT(*)=1

Demo