【发布时间】:2020-04-24 06:30:58
【问题描述】:
你好,互联网书呆子!
技术上我已经解决了这个问题,但想知道我是否应该采取更优化的路线......
我有一个大表(约 4m 行),它是一个数据集合,使用 int "chip" 进行分段。有 6 段数据,所以芯片 ID 为 1 到 6。
在这 6 个段中,我需要分配一个 order 整数,它需要是迭代的,因为它表示数据在所述段上的确切位置。
我的解决方案是(曾经)是这样的:
# set iterative
set @i:=0;
# init
update table set `order` = @i:=(@i+1) where chip = 1;
这行得通。但它太慢了,有时会触发超时错误。我需要运行它 6 次,它可能会在必要时由我们的应用程序偶尔触发。也许只是我需要更多的时间来设置 MySQL 来解决缓慢的查询,或者是否有一个最佳的、更简单的解决方案?
感谢您的建议。
编辑:
我找到了一个准确的解决方案,大约需要 50 秒才能完成。
我现在使用在更新中配对的有序选择语句,使用在列中迭代的生成的连接表。
见:
set @count:= 0;
update
table as target,
(select
(@count := @count+1) as row_num,
t.*
from table as t
where chip = 1
order by t.id asc) as table_with_iterative
set target.`order` = table_with_iterative.row_num
where target.id = table_with_iterative.id;
【问题讨论】:
-
这行得通 形式上它是随机排序的。 太慢了 什么是执行时间? 有没有最佳的、更简单的解决方案?指定 MySQL 版本并显示表的 DDL。
-
@Akina 我猜“这么慢”意味着它打破了我默认的 15 秒运行时间。我预计它必须在某个范围内徘徊。我可以添加一个临时的 lock_timeout 设置来修复吗?这对我来说就像一个补丁,但我想这样做没有错吗?
标签: mysql database algorithm optimization bigdata