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个小时.
删除这么多记录可能需要一段时间,我认为如果你这样做的话,它会尽可能快.如果您不想投资更快的硬件,我建议采用另一种方法:
如果你真的想要删除2.2亿条记录,那么该表只剩下15.000条记录,那就是所有条目的99,999%.为什么不
这样的事情可能会更快一些:
/* 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条记录,则应该相当快.