【问题标题】:Is there a way to slowdown mysql query for lower cpu usage?有没有办法减慢 mysql 查询以降低 CPU 使用率?
【发布时间】:2013-04-26 22:36:03
【问题描述】:

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

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

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

更新: 设置@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

【问题讨论】:

  • 这听起来很误导。听起来您的查询方法可能是一个问题,因为假设您使用正确的索引,对 300K 行进行更新不应该花费那么长时间。您可以在查询中添加信息吗?
  • 我已将我的查询添加到问题中
  • score 列上是否有索引? explain 对此查询表示什么?如果 MySQL 将这样的查询作为笛卡尔积执行,我不会感到惊讶,但这不是你应该一直做的操作。
  • @Niels 我无法对 UPDATE 查询进行解释,我认为它目前在我的 mysql 服务器(旧版本)上不存在。

标签: mysql query-optimization cpu-usage


【解决方案1】:

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

【讨论】:

  • 谢谢,尽管这不起作用(我在你回答后尝试过),我将创建一个名为 user_rank 和 TRUNCATE、INSERT 的永久表,我将查询该表而不是“从用户中选择排名” .这几乎立即返回。
  • 是的,如果您想拥有也可以使用的永久表。不知道为什么临时表不适合你
  • 我必须在“任何”时间查询“等级”值。这需要永久表或从临时表到主用户表的大规模更新(这会长时间锁定用户表)
【解决方案2】:

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

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

【讨论】:

  • 尽管我得到的答案是肯定的,但这是推荐 ionice/nice 最接近的答案。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2011-05-15
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多