この質問は何度も寄せられていますが、私が行っている更新は非常に単純で、パフォーマンスを向上させることができるかどうか知りたいです.
現在、合計で 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。
私が行う更新は非常に単純です。
classCode = -9999; ですべてのレコードを更新します。
update africaPop set classCode = -9999;
セル値が 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 FILE
key_buffer_size を使用して RAM の 25% に増やすことで、挿入時間を大幅に短縮することができました。
更新時間を短縮するにはどうすればよいですか?