5

MySqlでこの更新クエリを最適化する方法はありますか?

   UPDATE table1 t1 
   SET t1.column = 
   (SELECT MIN(t2.column) 
     FROM table2 t2 WHERE t1.id = t2.id
    );

どちらのテーブルにも約25万件のレコードがあります。

テーブル構造:

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)         
;

助けてくれてありがとう。

4

3 に答える 3

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);

単純な結合で更新します。列をnullに更新するかどうかに応じて、左結合または内部結合を使用できます)

UPDATE table1 
SET table1.`column` = tmp_operation.cln
INNER JOIN tmp_operation ON table1.id = tmp_operation.id;

完了後に一時テーブルを削除する

DROP TABLE tmp_operation;
于 2012-05-22T12:35:01.567 に答える
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)パフォーマンスに役立ちます。

于 2012-05-22T15:07:34.897 に答える
0

table1主キーのtable2に外部キーを追加します

UPDATE table1 t1
INNER JOIN table2 t2
ON t1.id = t2.id
SET t1.column = t2.column
having MIN(t2.column)

于 2012-05-22T11:54:50.900 に答える