mita2 database life

主にMySQLに関するメモです

mysqldumpで出力されるINSERT文の最大長は?

mysqldumpの --extended-insert オプションを利用すると、出力されるINSERT文がバルクINSERTの形式になる。
まとめてINSERTすることで、書き込み回数を減らし、importにかかる時間を短縮するための仕組み。

どこまで長いINSERT文が生成されるんだろうか?
まさか、10Gのテーブルをdumpしたら、10Gの巨大なINSERT文ができる・・・ということはないよね・・・

結論としては、net_buffer_lengthに収まるように調整される。
マニュアルにも記載がある。

クライアント/サーバー通信用のバッファーの初期サイズ。複数行の INSERT ステートメント (--extended-insert オプションまたは --opt オプションを使用する場合など) を作成する場合、mysqldumpnet_buffer_length までの長さの行を作成します。この変数を増加させる場合は、MySQL サーバー内の net_buffer_length 変数が少なくともこの大きさであることを確認してください。

試してみる。
mysqldumpはクライアントのため、mysqldumpを実行するサーバのclientセクションに書く必要がある。
$ cat .my.cnf
[client]
net_buffer_length=16K

$ mysqldump --triggers --routines --events --single-transaction --set-gtid-purged=OFF sbtest > dump16k.txt


$ cat .my.cnf
[client]
net_buffer_length=32K

$ mysqldump --triggers --routines --events --single-transaction --set-gtid-purged=OFF sbtest > dump32k.txt
うん、16Kと32Kで比較すると、INSERT文の数がだいたい半分になってる。
$ wc -l dump*.txt
12523 dump16k.txt
6246 dump32k.txt
18769 total