web-dev-qa-db-ja.com

MySQLトランザクションのサイズ-どのくらいの大きさですか?

頻繁に実行されるインポートプロセスがあり、それを「オールオアナッシング」の種類の取引、つまりトランザクションにしたい。

多くの側面があり、インポートは100k-1mil +レコードの間のどこかに収まる可能性があります。これは、数MBから数百MBのデータのペイロードに相当します。

一時テーブルが別のオプションであることは知っていますが、この方法はとても便利なようです。

コミット間で大量のデータ操作を行うこの種のプラクティスに関して注意すべき注意点はありますか? (一度コミットされると、通常の書き込み/インデックス付けの負荷バースト以外)

23
thinice

注意すべき1つのボトルネックは、InnoDBログバッファーです。サイズは innodb_log_buffer_size によって設定されます。 MySQLドキュメンテーションはそれについて次のように述べています。

InnoDBがディスク上のログファイルへの書き込みに使用するバッファーのサイズ(バイト単位)。デフォルト値は8MBです。大きなログバッファを使用すると、トランザクションがコミットする前にログをディスクに書き込む必要なく、大きなトランザクションを実行できます。したがって、大きなトランザクションがある場合、ログバッファーを大きくすると、ディスクI/Oを節約できます。

InnoDBログバッファーをInnoDBバッファープールと混同しないでください。それらの主な違いは、その目的です。 InnoDBログバッファーは、基本的には、REDOログ(ib_logfile0、ib_logfile1)に書き込まれる短期的な変更を記録します。 InnoDBバッファープール(サイズ innodb_buffer_pool_size )は、コミットされ(ページがダーティの場合)、最終的に書き込まれるデータページとインデックスページをディスクにキャッシュします。コミットされると、変更ページはLRUルールによって削除されるまでRAMに残ります。

大きなトランザクションは、ログバッファを通過する必要があります。前述のように、ログバッファが大きいほど、ディスクI/Oが減少します。大規模なコミットのみがボトルネックとなるでしょう。

他のInnoDBオプションを調べて設定することもできます。

さらなる研究のためのInnoDBの最適化に関する他の投稿があります

20
RolandoMySQLDBA