0

この質問は何度も寄せられていますが、私が行っている更新は非常に単純で、パフォーマンスを向上させることができるかどうか知りたいです.

現在、合計で 1 億 7,600 万件の約 3,600 万件のレコードを格納しているテーブルがあります。定義は次のとおりです。

CREATE  TABLE IF NOT EXISTS `mydb`.`africaPop` (
  `geokey` VARCHAR(14) NOT NULL ,
  `xpos` DECIMAL(7) NULL ,
  `ypos` DECIMAL(7) NULL ,
  `cellvalue` DECIMAL(14,5) NULL DEFAULT -9999 ,
  `classCode` INT(11)  NULL DEFAULT -9999 ,
  `classColour` VARCHAR(9) NULL DEFAULT NULL ,
  PRIMARY KEY (`geokey`) ,
  INDEX `IDXVALUE` (`cellvalue` ASC) );

テーブルには 2 つのインデックスがあります。主キーと idxvalue。

私が行う更新は非常に単純です。

  1. classCode = -9999; ですべてのレコードを更新します。

    update africaPop set classCode = -9999;
    
  2. セル値が 0 と 25 の間の classCode = 10 を更新します。

    update africaPop set classCode = 10 where cellvalue BETWEEN 0 AND 25;
    

更新は、8 つの独立したコアを備えた 48GB RAM Linux データベース サーバーで行われます。サーバーは新しく、ユーザーは 1 人だけなので、更新を処理するのはそのサーバーだけです。

最初の更新には 2 分 17 秒かかります。2 つ目は 2 分 28 秒かかります。

ばかげているように聞こえるかもしれませんが、2 分は私たちの要件には長すぎます。LOAD LOCAL IN FILEkey_buffer_size を使用して RAM の 25% に増やすことで、挿入時間を大幅に短縮することができました。

更新時間を短縮するにはどうすればよいですか?

4

0 に答える 0