Dan*_*iel 5 mysql sql query-optimization
请问有什么方法可以在MySql中优化这个更新查询?
UPDATE table1 t1
SET t1.column =
(SELECT MIN(t2.column)
FROM table2 t2 WHERE t1.id = t2.id
);
Run Code Online (Sandbox Code Playgroud)
两个表都有大约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)
;
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
我就是这样做的:
创建一个临时表来保存聚合值
CREATE TEMPORARY TABLE tmp_operation
SELECT id, MIN(`column`) as cln FROM table2 GROUP BY id;
Run Code Online (Sandbox Code Playgroud)
将索引添加到临时表以更快地连接到表1(可以根据数据大小省略此步骤)
ALTER TABLE tmp_operation ADD UNIQUE INDEX (id);
Run Code Online (Sandbox Code Playgroud)
使用简单连接更新.您可以使用左连接或内连接,具体取决于您是否要将列更新为空值)
UPDATE table1
SET table1.`column` = tmp_operation.cln
INNER JOIN tmp_operation ON table1.id = tmp_operation.id;
Run Code Online (Sandbox Code Playgroud)
完成后删除临时表
DROP TABLE tmp_operation;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1832 次 |
| 最近记录: |