🐏

mysqlコマンドで大きな結果を逐次出力する

2022/05/17に公開

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