Mysql InnoDBと大規模な更新の迅速な適用

Mysql InnoDBと大規模な更新の迅速な適用

基本的に私の問題は、約 17,000,000 個の製品を含む大きなテーブルがあり、これに大量の更新を非常に迅速に適用する必要があることです。

テーブルには、IDがint(10) AUTO_INCREMENTとして設定された30列があります。

このテーブルのすべての更新が保存される別のテーブルがあります。これらの更新は計算に数日かかるため、事前に計算する必要があります。このテーブルの形式は [ product_id int(10), update_value int(10) ] です。

これら 1,700 万件の更新を迅速に発行するために私が採用している戦略は、Ruby スクリプトでこれらの更新をすべてメモリに読み込み、各 update_value がキーになり、各配列が並べ替えられた product_id のリストになるように、配列のハッシュにグループ化することです。

{ 
   150: => [1,2,3,4,5,6],
   160: => [7,8,9,10]
}

アップデートは次の形式で発行されます。

UPDATE product SET update_value = 150 WHERE product_id IN (1,2,3,4,5,6);
UPDATE product SET update_value = 160 WHERE product_id IN (7,8,9,10);

ソートされた product_id のバッチで更新を発行することが、mysql / innodb でこれを行う最適な方法であるという意味で、私はこれを正しく実行していると確信しています。

しかし、奇妙な問題が発生しています。約 1,300 万件のレコードを更新するテストでは、約 45 分しかかかりませんでした。現在、より多くのデータ (約 1,700 万件のレコード) でテストしていますが、更新には 120 分近くかかります。ここで何らかの速度低下が起こることは予想していましたが、私が目にしているほどではありません。

これを高速化する方法や、この大規模なレコード セットで速度が低下する原因についてアドバイスはありますか?

サーバーの仕様に関しては、メモリと CPU がたっぷりあるので、DB 全体がメモリに収まり、拡張の余地も十分にあります。

関連情報