如何优化MySQL UPDATE

时间:2012-05-22 11:47:48

标签: mysql sql query-optimization

请问如何在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)         
;

感谢您的帮助。

3 个答案:

答案 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)

examples