🐏
mysqlコマンドで大きな結果を逐次出力する
mysqlのコマンドを使ってSQLを発行した時に、超大な結果が返却されるケースでハマったので対応について記載します。
結論 -q もしくは --quickを設定する
mysql -q
mysql --quick
元のmysqlコマンドの実行例
この場合クエリ結果は一回メモリにキャッシュされる。
そのため超大な結果を全部を一回メモリに抱えるまでファイルに出力されない。
echo '
select * from test_table as t
where t.id <> 0
' | mysql > output.txt
変更後のmysqlコマンドの実行例
この場合は行毎にファイルに出力される。
そのためメモリを大量には使用しない。
echo '
select * from test_table as t
where t.id <> 0
' | mysql -q > output.txt
まとめ
つまりバッファリングしなくなるので、パイプでつなげて実行する場合もこちらを利用したほうがよさそうである。
今後は基本的には大小に関係なく指定することにする。
数千万レコードの返却時に、数十G使用してOOM Killerで落とされていた。
Discussion