MySQLトランザクションサイズ-大きすぎますか?


23

頻繁に実行されるインポートプロセスがあり、それを「すべてまたは何もしない」種類の取引、つまりトランザクションにしたいのです。

多くの側面があり、インポートによって100k-1mil +のレコードが生成される場合があります。これは、数MBから数百MBのデータのペイロードに相当します。

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

コミット間で大量のデータ操作を行うこの種のプラクティスに関して注意すべき注意事項はありますか?(コミット後の一般的な書き込み/インデックス作成の負荷バーストの外側)


個人的には、バランスを取るのが好きです。私は1kまたは10kのトランザクションでインポートを行います。これは、バッファサイズまたはその他のばかげたことにより、約900k行に達し、その後クラッシュすることを知っているからです。そこから取り出すのは非常に簡単で、I / Oはそれほど多くありません。
キャプテンハイパーテキスト

回答:


20

認識すべきボトルネックの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を最適化することに関する他の投稿があります


どういうわけか私はあなたがこれに参加することを知っていました。あなたがいつも与えると思われる徹底的な答えをありがとう。補足質問:innodb_io_capacityの使用に関するリソースはありますか?5400 / 7200RPMコンシューマSATAの値が100であることをドキュメントが示唆している場合、その値を非常に高く設定することで「制限を取り除く」だけの戦略を提案しますか?
thinice

私は通常innodb_io_capacityをより高く設定し、ハードウェアにそれを任せます。これを今すぐ回答に追加します。
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.