Php 在MYSQL中更新10000多行数据的有效方法?

Php 在MYSQL中更新10000多行数据的有效方法?,php,mysql,Php,Mysql,我想查询一个表,并更新表中的数据,但数据超过10000行,那么什么是有效的方法呢?我现在的代码: +----+------+---------+ |id | rank | newrank | +----------------------+ |1 | 1 | 0 | |2.. | 2 | 0 | |10000| 10000| 0 | +----------------------+ //I am using a template lan

我想查询一个表,并更新表中的数据,但数据超过10000行,那么什么是有效的方法呢?我现在的代码:

+----+------+---------+
|id   | rank | newrank |
+----------------------+
|1    | 1    | 0       |
|2..  | 2    | 0       |
|10000| 10000| 0       |
+----------------------+
//I am using a template language, DB::query = mysqli_query
$ss = DB::fetch_all("SELECT *FROM t1 ORDER BY rank ASC");
$x = 1;
foreach($ss as $sr){
  DB::query("UPDATE t1 SET newrank = '".$x."' WHERE id = '".$sr['id']."'");
  $x++;
}

目前我正在使用上面的代码,但是如果数据需要大量更新,服务器将会崩溃。谢谢。

执行此操作不需要获取任何内容,也不需要担心行数*

给出一个测试表:

create table t1 (id int primary key, `rank` int);
insert into t1 values (1, null), (2, null), (3, null), (6, null);
MySQL 5.x的解决方案:

set @r = 0;
update t1 set `rank` = (@r := @r + 1) order by `rank`, id;

select * from t1;
+----+------+
| id | rank |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  6 |    4 |
+----+------+
这里有一个更好的MySQL 8.0解决方案,它使用了一个窗口函数。我将按降序排列,这样我们就可以看到它改变了排名:

with cte as ( select id, rank() over (order by `rank` desc, id desc) as r from t1 ) 
update cte join t1 using (id) set t1.`rank` = cte.r;

select * from t1;
+----+------+
| id | rank |
+----+------+
|  1 |    4 |
|  2 |    3 |
|  3 |    2 |
|  6 |    1 |
+----+------+
注意:我必须用后面的记号来分隔
rank
,因为rank是一个符号



*最后,您确实需要担心行的数量。如果启用了二进制日志,MySQL对事务的总大小有限制。事务期间修改的行的总大小受选项
max\u binlog\u cache\u size
的限制。不是行数,而是以字节为单位的行大小。

为什么要进行此更新?这是否回答了您的问题?什么类型的
newrank
字段?它的值范围是否有限?您可以按级别对ROS进行分组,并使用
UPDATE t1 SET newrank='“$x.”,其中id位于(……)