我通过DESC在具有300k行的表上排序INT行,并选择@rownum:= @ rownum + 1来更新同一行的RANK字段。
它工作得很好,但需要很长时间。我可以接受更长的时间,但我可以稍微让它睡一觉给CPU提供一些空间来完成其他工作吗?
喜欢将睡眠(0.25秒)放入一段时间(1> 0)循环...
更新 SET @ rownum = 0; 更新用户u,(SELECT @rownum:= @ rownum + 1作为排名,id FROM user u order by score DESC)as bb SET u.rank = bb.rank WHERE u.id = bb.id
答案 0 :(得分:1)
我可能会创建一个带有自动增量ID的临时表来执行此操作。然后,您可以INSERT ... SELECT
将已排序的值放入临时表中以生成排名顺序。然后,您可以通过连接更新原始表。
答案 1 :(得分:0)
没有。您可以使用insert delayed
语句对优先级产生轻微影响,将low_priority
添加到更新中,或者将high_priority
添加到选择中。这仅影响使用它们的存储引擎中的表锁的某些排队。但是,您无法进行更精细的控制。它也不应该那样,因为DBMS将在内部平衡自身,而一个慢速查询永远不应该使另一个查询 MUCH 变慢。如果“其他工作”指的是同一台服务器上的其他任务,则只需ionice
或nice
整个mysqld
进程。
在回答了实际问题之后,您的查询可能会很慢,因为它错过了您要排序的字段上的索引,因此会触发执行计划中的filesort
和temporary
标记。修复可能会使整个问题没有实际意义。