慢自我加入删除查询

BMi*_*ner 1 sql performance join self-join sql-delete

它比这个查询更简单吗?

delete a.* from matches a
    inner join matches b ON (a.uid = b.matcheduid)
Run Code Online (Sandbox Code Playgroud)

是的,显然它确实...因为当matches表非常大时,上述查询的性能非常糟糕.

matches约有2.2亿条记录.我希望这个DELETE查询的大小减少到大约15,000条记录.如何提高查询性能?我在两列都有索引.UID和MatchedUID是此InnoDB表中仅有的两列,两者都是INT(10)无符号类型.该查询已在我的笔记本电脑(i7处理器)上运行超过14个小时.

Bjo*_*ern 7

删除这么多记录可能需要一段时间,我认为如果你这样做的话,它会尽可能快.如果您不想投资更快的硬件,我建议采用另一种方法:

如果你真的想要删除2.2亿条记录,那么该表只剩下15.000条记录,那就是所有条目的99,999%.为什么不

  1. 创建一个新表,
  2. 只需插入您想要存活的所有记录,
  3. 并用新的替换旧的?

这样的事情可能会更快一些:

/* creating the new table */
CREATE TABLE matches_new
SELECT a.* FROM matches a
LEFT JOIN matches b ON (a.uid = b.matcheduid)
WHERE ISNULL (b.matcheduid)

/* renaming tables */
RENAME TABLE matches TO matches_old;
RENAME TABLE matches_new TO matches;
Run Code Online (Sandbox Code Playgroud)

在此之后,您只需检查并创建所需的索引,如果仅处理15.000条记录,则应该相当快.