请问如何在MySql中优化此更新查询?
UPDATE table1 t1
SET t1.column =
(SELECT MIN(t2.column)
FROM table2 t2 WHERE t1.id = t2.id
);
两个表都有大约250 000条记录。
表格结构:
CREATE TABLE `table1` (
`id` int(11) NOT NULL,
`column` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `table2` (
`code` int(11) NOT NULL,
`id` int(11) NOT NULL,
`column` datetime NOT NULL,
PRIMARY KEY (`code, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
ALTER TABLE table2 ADD CONSTRAINT FK_id
FOREIGN KEY (id) REFERENCES table1 (id)
;
感谢您的帮助。
答案 0 :(得分:5)
我就是这样做的:
创建一个临时表来保存聚合值
CREATE TEMPORARY TABLE tmp_operation
SELECT id, MIN(`column`) as cln FROM table2 GROUP BY id;
为临时表添加索引,以便更快地加入表1(可以根据数据大小省略此步骤)
ALTER TABLE tmp_operation ADD UNIQUE INDEX (id);
使用简单连接进行更新。您可以使用左连接或内连接,具体取决于您是否要将列更新为空值)
UPDATE table1
SET table1.`column` = tmp_operation.cln
INNER JOIN tmp_operation ON table1.id = tmp_operation.id;
完成后删除临时表
DROP TABLE tmp_operation;
答案 1 :(得分:2)
您可以先将表格t2
分组,然后再使用JOIN
(这类似于@ frail的答案,但没有临时表格):
UPDATE
table1 t1
JOIN
( SELECT id
, MIN(column) AS min_column
FROM table2
GROUP BY id
) AS t2
ON t2.id = t1.id
SET t1.column = t2.min_column ;
table2
上的(id, column)
索引有助于提升效果。
答案 2 :(得分:0)
在表1主键的表2中添加外键
UPDATE table1 t1
INNER JOIN table2 t2
ON t1.id = t2.id
SET t1.column = t2.column
having MIN(t2.column)