gpt4 book ai didi

php - 使用 CASE 更新多行需要很长时间

转载 作者:行者123 更新时间:2023-11-30 00:52:58 24 4
gpt4 key购买 nike

我正在尝试使用以下 PHP 代码更新表的多行。 main_key是主键,显然是有索引的。我曾多次尝试运行该代码,但每次执行时它都会在那里停留很长时间。 (我不会让它运行超过 10 秒,以防它以某种方式破坏文件。)

我想更新很多行,但我只是先测试几行。

该表有大约 150 万条记录。

$query = "UPDATE myfile SET service_no = 
(CASE main_key
WHEN 72016 THEN 484
WHEN 985643 THEN 1874
END)";
mysql_query($query) or die(mysql_error());

当我将代码更改为正常的单记录更新时,它会立即运行:

$query = "UPDATE myfile SET service_no = 484
WHERE main_key = 72016";
mysql_query($query) or die(mysql_error());

最佳答案

目前尚不清楚您想要得到什么。
这两个查询完全不同。
您想更新所有行吗?或者仅包含 main_key 为 72016 或 985643 的行?


第一个查询更新整个表(所有行)。
假设我们有下表:

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
| 1 | 1 |
| 72016 | 1 |
| 985643 | 1 |
| 111111111 | 1 |

第一个查询将一些值分配给具有 main_key = 72016 或 985643 的行的 service_no 列,并将 NULL 分配给所有其他行。我很慢,因为它正在更改整个表(所有行):

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
| 1 | (null) |
| 72016 | 484 |
| 985643 | 1874 |
| 111111111 | (null) |

第二个查询仅更改具有 mail_key = 72016 的行,并且不会触及其他行 - 它会跳过它们,因此速度更快:

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
| 1 | 1 |
| 72016 | 484 |
| 985643 | 1 |
| 111111111 | 1 |

看看这个演示:http://www.sqlfiddle.com/#!2/0e1c2/1

如果您只想更改具有 main_key = 72016 或 985643 的行,并且不想更改其他行,请使用以下查询:

  UPDATE myfile SET service_no = 
CASE main_key
WHEN 72016 THEN 484
WHEN 985643 THEN 1874
END
WHERE main_key IN ( 72016, 985643 );

如果在 main_key 上创建了索引,则此查询会更快,因为它会跳过 72016、985643 之外的其他行。
请参阅此演示中的第三个查询:http://www.sqlfiddle.com/#!2/0e1c2/1
运行此查询后的表如下所示:

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
| 1 | 1 |
| 72016 | 484 |
| 985643 | 1874 |
| 111111111 | 1 |

关于php - 使用 CASE 更新多行需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20813261/

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