gpt4 book ai didi

mysql - 如何更新巨大的表列?

转载 作者:行者123 更新时间:2023-11-29 06:35:22 25 4
gpt4 key购买 nike

我有一个表,里面有9918751条记录,下面是数据结构,

+--------------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| start_ip | varchar(32) | YES | UNI | NULL | |
| end_ip | varchar(32) | YES | UNI | NULL | |
| country | varchar(255) | YES | | NULL | |
| region | varchar(255) | YES | | NULL | |
| city | varchar(255) | YES | | NULL | |
| country_conf | varchar(255) | YES | | NULL | |
| region_conf | varchar(255) | YES | | NULL | |
| city_conf | varchar(255) | YES | | NULL | |
| country_code | int(11) | YES | | NULL | |
| region_code | int(11) | YES | | NULL | |
| city_code | int(11) | YES | | NULL | |
| two_letter_country | varchar(20) | YES | | NULL | |
| creation_datetime | timestamp | NO | | CURRENT_TIMESTAMP | |
+--------------------+--------------+------+-----+-------------------+----------------+

在我的表中,start_ipend_ip 列包含有效的 IPv4 IP 地址(如 192.168.1.112.23.34.22 等),现在我想更新所有行 (9918751) 以使用 INET_ATON() 函数将 IP 地址转换为整数。当我在查询下面运行时

update geo_location_info set start_ip = INET_ATON(start_ip);

此查询在更新 9918751 行时花费了太多时间,并且未完成更新。请让我知道任何替代方案(存储过程?)

最佳答案

基本思想是使用循环进行更新。问题是函数调用需要一段时间,查询可能会超时。此外,更新将近 1000 万行对维护数据完整性的日志记录机制造成了一定的负担。假设 id 是递增填充的,您可以以 10,000 个或 100,000 个为一组执行此操作。不幸的是,您不能真正使用@Stewarts 的想法,但几乎所有行中的一半可能以 1 开头。

基本循环是:

set @len := 10000, @i := 1;

while @i * @len < 10000000 do
update geo_location_info
set start_ip = INET_ATON(start_ip)
where id between @len*@i and @len*(@i + 1) - 1;
set @i := @i + 1;
end while;

不幸的是,在 MySQL 中,您需要将其放入存储过程中——因为控制流机制(例如 while)只允许在存储程序中使用。所以,更像是:

delimiter $$
create procedure do_update ()
begin
set @len := 10000, @i := 1;
select @max := max(id) from geo_location_info;

while @i * @len <= @max do
update geo_location_info
set start_ip = INET_ATON(start_ip)
where id between @len*@i and @len*(@i + 1) - 1;
set @i := @i + 1;
end while;
end $$
delimiter ;

关于mysql - 如何更新巨大的表列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241670/

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