0

MySQL データベースで何百万もの行を更新および挿入する際に問題が発生しています。テーブル A の 5,000 万行にフラグを付け、マークされた 5,000 万行のデータをテーブル B に挿入し、テーブル A の同じ 5,000 万行を再度更新する必要があります。テーブル A には約 1 億 3000 万行、テーブル B には 8000 万行あります。

これは、Web サイトからの他のクエリへのアクセスを拒否することなく、ライブ サーバーで行う必要があります。問題は、このストアド プロシージャの実行中に、Web サイトからの他のクエリがロックされ、HTTP 要求がタイムアウトになることです。

これがSPの要点であり、説明のために少し簡略化されています。

CREATE DEFINER=`user`@`localhost` PROCEDURE `MyProcedure`(  
  totalLimit  int
)
BEGIN
  SET @totalLimit = totalLimit; 
  /* Prepare new rows to be issued */
  PREPARE STMT FROM 'UPDATE tableA SET `status` = "Being-Issued" WHERE `status` = "Available" LIMIT ?';
  EXECUTE STMT USING @totalLimit;
  /* Insert new rows for usage into tableB */
  INSERT INTO tableB (/* my fields */)
    SELECT /* some values from TableA */ 
    FROM tableA
    WHERE `status` = "Being-Issued";
  /* Set rows as being issued */
  UPDATE tableB SET `status` = 'Issued' WHERE `status` = 'Being-Issued';
END$$

DELIMITER ;
4

2 に答える 2

0

50M 行を 3 回処理すると、何を行っているかに関係なく遅くなります。

更新が、サイズが小さくばらばらなセットに影響することを確認してください。そして、同じトランザクション内ですべてを実行するのではなく、それぞれを 1 つずつ実行します。

すでにこれを行っていて、MySQL が正しく動作しない場合は、コードを少し調整してみてください。

create a temporary table

begin

insert into tmp_table
select your stuff
limit ?
for update

do your update on A using tmp_table

commit

begin
do your insert on B using tmp_table
do your update on A using tmp_table
commit

これにより、最小限の時間ロックが保持されます。

于 2011-05-25T16:35:41.457 に答える