基本的に私の問題は、大量の更新を非常に迅速に適用する必要がある約 17,000,000 製品の大きなテーブルがあることです。
テーブルには、int(10) AUTO_INCREMENT として設定された ID を持つ 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全体がメモリに収まり、成長する余地が十分にあります。