innoDBテーブルを持つMySqlDbがあります。
いくつかの大きなテーブル(最大5,000万レコード)を変更する必要があります。変更すると、プロセスをできるだけ速くしたいテーブルがロックされるためです。
速度の点で最良のもの:1。一度に1つのテーブルを変更する2.同時に両方のテーブルを変更する(同時に)
何か案は?
innoDBテーブルを持つMySqlDbがあります。
いくつかの大きなテーブル(最大5,000万レコード)を変更する必要があります。変更すると、プロセスをできるだけ速くしたいテーブルがロックされるためです。
速度の点で最良のもの:1。一度に1つのテーブルを変更する2.同時に両方のテーブルを変更する(同時に)
何か案は?
私はテストをしました。
400 万行のテーブルを作成しました。非常に単純なテーブル、1 つの列、すべての値がすべての行の「おい」です。次に、そのテーブルをまったく同じデータを含む big_2 に複製しました。
私のコンピューターは2010年半ばからのmacbook pro 13.3インチなので、すべてがそれに関連しています.
それから私は3つのことをしました。
これは、並行してこれ以上速くならないという私の疑いを裏付けています。最も可能性の高い理由は、これがほぼ完全にディスク上の操作であり、まったく並列化できないことです。
同時進行ではあまり効果がありません。2 番目の処理を実行するには、最初の処理が完了するまで待機する必要があります。
最初の更新の開始以降、ロックを待機している他のクエリが 2 番目の更新も待機する必要がないように、クエリ間の短い遅延を使用してクエリを実行することをお勧めします。たとえば、データベースが Web サイトにサービスを提供している場合、15 秒間のハングが 2 回発生する方が、30 秒間のハングが 1 回発生するよりも優れています。
実際には、サーバーにあるメモリの量に依存します。
ALTER TABLE を実行しているときは、テーブルとその最大のセカンダリ インデックス (innodb クラスターが主キーであるため、PK が行と共に格納されていることを思い出してください) がメモリに収まるようにする必要があります。そうでない場合は、処理が遅くなります (注意: この説明では、テーブルが分割されていないことを前提としています)。
あなたのテーブルには小さな50M 行があるため、すべてのセカンダリ インデックスを使用して RAM に簡単に収まる可能性があります (サーバーには 32G+ がありますよね?)。
すべてが innodb バッファ プールに収まる場合は、それらを並行して実行します。それらをシリーズで行わない場合。
本番環境と同じ仕様の開発サーバーで試してみてください (明らかに、同じサイズの innodb_buffer_pool で構成してください)。