0

我需要从我的数据库中查找并删除几乎重复的条目,这些条目仅以斜杠结尾。换句话说,一行会有 URL “ http://www.google.com ”,另一行会有“ http://www.google.com/ ” 我在这里发布了这个问题,一位非常有帮助的专家给了我这个解决方案

DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE TRIM(TRAILING '/' FROM li1.url) =
      TRIM(TRAILING '/' FROM li2.url)
AND li1.id<li2.id

该代码完全在我需要的时候完成了,除了它耗尽了我所有的服务器内存并每次都杀死我的 VPS。是否有任何替代方法可以以更少的资源密集型或更慢的方式运行它,以保持我的服务器正常运行?我在 phpmyadmin 中运行命令。谢谢!

4

1 回答 1

1

如果你用一个语句修剪尾部斜杠怎么办:

UPDATE Link_Info
SET url=LEFT(url, LENGTH(url)-1) /*everything but the last character, which can only be a slash*/
WHERE url LIKE '%/';

然后运行清理脚本,但进行斜杠处理:

DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE li1.url = li2.url
AND li1.id<li2.id

这样您就可以拆分处理。我对 MySql 知之甚少,但是在连接条件 ( TRIM(TRAILING '/' FROM li1.url) = TRIM(TRAILING '/' FROM li2.url)) 中有一个函数可能意味着查询也不能从任何索引中受益。

哦,当您使用它时,您可能还想清理任何空间:

UPDATE Link_Info
SET url=LTRIM(RTRIM(url))
WHERE url LIKE '% %';

所以我会清理空格,然后删除尾部斜杠,然后进行重复数据删除。

于 2013-02-01T03:46:15.293 回答