0

我在一个有 300k 行的表上通过 DESC 对 INT 行进行排序,并选择 @rownum:=@rownum+1 来更新同一行的 RANK 字段。

它工作得很好,但需要很长时间。我可以接受更长的时间,但我可以让它休眠给 CPU 一些空闲空间来完成其他工作吗?

就像把 sleep(0.25 sec) 放在 while(1>0) 循环中......

更新: 设置@rownum=0;更新用户 u,(SELECT @rownum:=@rownum+1 作为 rank,id FROM user u order by score DESC)作为 bb SET u.rank=bb.rank WHERE u.id=bb.id

4

2 回答 2

1

我可能会创建一个带有自动增量 ID 的临时表来执行此操作。然后,您可以INSERT ... SELECT将排序值放入临时表中以生成排名序列。然后,您可以通过连接更新原始表。

于 2013-05-02T16:56:18.210 回答
0

不会。您可以通过添加到更新或添加到选择来对insert delayed语句的优先级产生一些较小的影响。这只会影响一些使用它们的存储引擎中的表锁排队。但是,您不能拥有比这更精细的控制。也不应该是这样,因为 DBMS 会在内部平衡自己,一个慢查询不应该让另一个查询得多。如果“其他工作”是指同一服务器上的其他任务,则可以只是或整个过程。low_priorityhigh_priorityionicenicemysqld

回答了实际问题后,您的查询可能会这么慢,因为它错过了您正在排序的字段上的索引,例如执行计划上的触发filesort和标志。temporary解决这个问题可能会让整个问题变得毫无意义。

于 2013-05-02T16:49:00.607 回答