gpt4 book ai didi

php - 从 MySql 表中删除重复行

转载 作者:行者123 更新时间:2023-11-29 01:09:02 25 4
gpt4 key购买 nike

我有一个脚本可以在我的 MySql 表中查找重复的行,该表包含 40,000,000 行。但是速度很慢,有没有更简单的方法可以在不进出 php 的情况下找到重复记录?

这是我目前使用的脚本

 $find = mysql_query("SELECT * FROM pst_nw ID < '1000'");
while ($row = mysql_fetch_assoc($find))
{
$find_1 = mysql_query("SELECT * FROM pst_nw add1 = '$row[add1]' AND add2 = '$row[add2]' AND add3 = '$row[add3]' AND add4 = '$row[add4]'");
if (mysql_num_rows($find_1) > 0) {
mysql_query("DELETE FROM pst_nw WHERE ID ='$row[ID]'}

}

最佳答案

您有多种选择。

让数据库完成工作

使用唯一索引创建表的副本 - 然后将数据从源表插入其中:

CREATE TABLE clean LIKE pst_nw;
ALTER IGNORE TABLE clean ADD UNIQUE INDEX (add1, add2, add3, add4);
INSERT IGNORE INTO clean SELECT * FROM pst_nw;
DROP TABLE pst_nw;
RENAME TABLE clean pst_nw;

这样做的好处是您可以在删除源表之前验证新表是否正确。缺点是它占用两倍的空间并且执行起来(相对)慢。

让数据库完成工作#2

您还可以通过以下方式实现您想要的结果:

set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);

需要第一个命令作为 the ignore flag being .. ignored 的解决方法

这里的优点是不会弄乱临时表 - 缺点是您无法在运行之前检查更新是否完全符合您的预期。

例子:

 CREATE TABLE `foo` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`one` int(10) DEFAULT NULL,
`two` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
)

insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);

select * from foo;
+----+------+------+
| id | one | two |
+----+------+------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 1 |
+----+------+------+
3 row in set (0.00 sec)

set session old_alter_table=1;
ALTER IGNORE TABLE foo ADD UNIQUE INDEX (one, two);

select * from foo;
+----+------+------+
| id | one | two |
+----+------+------+
| 1 | 1 | 1 |
+----+------+------+
1 row in set (0.00 sec)

不要在数据库之外做这种事

特别是在 4000 万行的情况下,在数据库外做这样的事情可能会花费大量时间,而且可能根本无法完成。保留在数据库中的任何解决方案都将更快、更可靠。

关于php - 从 MySql 表中删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com