所以你有 100000 个工作,你担心更新工作需要做多少工作?100000真的不多。一个标准的 mysql 数据库应该能够非常快地处理这些查询。这让数据库使用所有相关项目。
在 mysql fiddle 上创建模式需要 187 毫秒。
在我的本地开发机器上运行它,插入 100.000 个虚拟行需要 650 毫秒。排序顺序的实际更新?不可测量。
17:39:40 CREATE TABLE test
( id
INT(11) NOT NULL AUTO_INCREMENT, machine_id
INT NULL, job_id
INT NULL, sort_order
INT NULL, PRIMARY KEY ( id
),INDEX machine
( machine_id
ASC, sort_order
ASC)) 0 行受影响 0.016 秒
17:39:40 插入test
(machine_id, job_id, sort_order) 值 (1,1,1) 1 行受影响 0.000 秒
17:39:40 插入test
(machine_id, job_id, sort_order) select t.machine_id, t.job_id, t.sort_order from test
t 1 行受影响的记录:1 重复:0 警告:0 0.000 秒
17:39:40 插入test
(machine_id, job_id, sort_order) select t.machine_id, t.job_id, t.sort_order from test
t, test
t2, test
t3, test
t4 16 行受影响记录:16 重复:0 警告:0 0.000秒
17:39:40 插入test
(machine_id, job_id, sort_order) select t.machine_id, t.job_id, t.sort_order from test
t, test
t2, test
t3, test
t4 104976 行受影响记录:104976 重复:0 警告:0 0.657秒
17:39:41 更新测试集 machine_id = 50 其中 id > 49555 和 id < 49999 443 行受影响 匹配行:443 更改:443 警告:0 0.000 秒
17:39:41 更新测试 MAIN INNER JOIN (SELECT id, machine_id, @rowNumber := @rowNumber + 10 AS rn FROM test , (SELECT @rowNumber := 0) var where machine_id=50 ORDER BY sort_order ASC ) AS t ON MAIN.id = t.id SET MAIN.sort_order = t.rn 其中 MAIN.machine_id = 50 443 行受影响的行匹配:443 更改:443 警告:0 0.000 秒
我的建议是:确保你的索引没问题,让数据库来做繁重的工作。在您的代码中进行一些测试,以最大限度地利用数据库,使数据库服务器处于压力之下。让它在 5 分钟内完成一天的工作。我敢打赌,它会坚持下去。
确保您的 sort_order 在排序之间总是有 10 步的差异。这样一来,您总是可以在必须使用相关条目之前插入“9”个工作。还有一个轻量级的关系表,它将作业链接到机器,只有排序顺序作为额外数据,并且可能添加了一个主键,以便能够轻松地直接更新作业关系。
以这个演示数据库为例:http ://sqlfiddle.com/#!9/3cf11e/1
CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`machine_id` INT NULL,
`job_id` INT NULL,
`sort_order` INT NULL,
PRIMARY KEY (`id`),INDEX `machine` (`machine_id` ASC, `sort_order` ASC));
insert into `test` (machine_id, job_id, sort_order) values (1,1,1);
insert into `test` (machine_id, job_id, sort_order) select t.machine_id, t.job_id, t.sort_order from `test` t;
insert into `test` (machine_id, job_id, sort_order) select t.machine_id, t.job_id, t.sort_order from `test` t, `test` t2, `test` t3, `test` t4;
insert into `test` (machine_id, job_id, sort_order) select t.machine_id, t.job_id, t.sort_order from `test` t, `test` t2, `test` t3, `test` t4;
update test set machine_id = 50 where id > 49555 and id < 49999;
UPDATE
test MAIN
INNER JOIN
(
SELECT
id,
machine_id,
@rowNumber := @rowNumber + 10 AS rn
FROM test , (SELECT @rowNumber := 0) var
where machine_id=50
ORDER BY sort_order ASC
) AS t
ON MAIN.id = t.id
SET MAIN.sort_order = t.rn
where MAIN.machine_id = 50;
select * from test where machine_id = 50;
记录数:443;执行时间:11ms