Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何更新庞大的表列?_Mysql_Sql - Fatal编程技术网

Mysql 如何更新庞大的表列?

Mysql 如何更新庞大的表列?,mysql,sql,Mysql,Sql,我有一个包含9918751记录的表,请查找下面的数据结构 +--------------------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-

我有一个包含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\u ip
end\u ip
列包含有效的IPv4 ip地址(如
192.168.1.1
12.23.34.22
等),现在我想更新所有行(9918751),使用
INET\u ATON()
函数将ip地址转换为整数。当我在下面运行查询时

update geo_location_info set start_ip = INET_ATON(start_ip);

此查询更新9918751行花费了太多时间,并且没有完成更新。请告诉我任何替代方案(存储过程?

基本思想是使用循环进行更新。问题是函数调用需要一段时间,查询可能会超时。此外,更新近1000万行会给维护数据完整性的日志机制带来一定的负担。假设
id
是以增量方式填充的,您可以以10000或100000人为一组执行此操作。不幸的是,您不能真正使用@Stewarts idea,但几乎一半的行可能以
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;

绑定您的查询。例如,运行10次,一次id=1*,2*,3*,等等。您可以创建一个游标,每次迭代只更新一行。将花费大量时间,但不会返回错误,这是一个快速有效的解决方案?存储过程?游标或绑定查询
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 ;