• ベストアンサー

mysqlのCSV出力について

mysqlのCSV出力について意見下さい。 mysqlからコマンドで50000万行のURLをCSV出力させるとすぐに出力されますが、ブラウザからダウンロードすると10分近くかかります。ブラウザのダウンロードは遅いものでしょうか?最悪シェルをキックして起動しようとしてます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

現に、コマンドでは応答がすぐに返ってくるとのことですし、 50000行のcsvをサーバのローカル内に生成することについては、 それほどボトルネックにはなっていないと思います。 むしろ、ブラウザダウンロードするファイルのサイズについてですが、 CSV各行100文字あったとして、ファイルサイズは約5Mほどになります。 実運用でどのくらいのファイルサイズになるのかわかりませんが、 当然、ブラウザからのダウンロードも ユーザーの環境によっては時間がかかるものになってしまうと思います。 ボトルネックはサーバ側WEBプログラムでのCSV作成ではなく 生成されたファイルをダウンロードする部分にあるような気がしています。 もしそうであった場合、シェルのキックに変更しても 実測時間は余り変わらないのではないでしょうか? 現在のプログラムから  A.CSVを生成するプログラムのみを実行して、所要時間を計測  B.出来上がったファイルをサーバ上に配置し、   URLを直接CSVファイルに向けてダウンロードのみの所要時間を計測 といった2ステップを行ってみると、 原因が明確になると思います。 CSVを手に入れさせることが目的であれば、  (1)コマンドでCSVを作成  (2)出来上がったCSVをgzipで圧縮  (3)zipをブラウザからダウンロード というプロセスを実現したほうがよいかもしれませんね。

saekija
質問者

お礼

詳細な検証まで行ってませんが、 PHPでprintfを 50000回行ってその出力結果をファイル出力にする というのが時間がかかってます。 5分でダウンロードすると5分でタイムオーバーになり 途中まで書かれたファイルがダウンロードされます。 なーるほど、圧縮すればいいですね。 >CSVを手に入れさせることが目的であれば、 > (1)コマンドでCSVを作成 > (2)出来上がったCSVをgzipで圧縮 > (3)zipをブラウザからダウンロード >というプロセスを実現したほうがよいかもしれませんね。

その他の回答 (2)

回答No.2

クロック数が関係するのかどうかは発行するSQLの複雑度によります。 確実に関係するのはHDDの速度です。 回線を10分かかって転送する位の大容量のファイルを読み書きする速度です。 SQLがそれほど時間がかからないということは単純なSQLかインデックスを使用した検索のみだと思われますので、それほどCPUは使っていないと思います。 それよりも大容量のデータを読み出してそれをCSVで書き出すHDDの性能がほとんどCSV出力時に時間だと思われます。もともとMysqlなんてそんなに高度なことはできないと思っていますので、それほどCPUは食わないのでは?と思います。 Oracle等ではそれなりにCPU性能が影響しますがHDD性能差に比べればそれほど・・・ DB構築の際、一番のポイントはHDDの高速化+分散化かメモリのどちらかで、CPU性能はおまけみたいなものですから・・・

saekija
質問者

お礼

回答ありがとうございました。 ハードよりも、自分のかいたプログラムが悪そうです。(100%) 単純なSQLです。 select * from table; です。 DBでoracleは、何がすごくてmysqlだと何がだめなのか? 自分は、検討もつきません。 有料か無償ぐらいしか差がわかりません。 分散化の必要性も迫られたことがありません。 これからwildcat-ypさんがおっしゃるような問題に つきあたるのでしょうか?

回答No.1

そりゃあ、当然、同じスピードではあり得ませんよね? 10分が遅いか早いかはファイルの容量と回線の速度を出してもらわないと何とも言えません。 まあ、それ以前に50000万行(5億行?)のファイルがすぐに出力されるというのも不思議な話ですが? どんなサーバー使ってるんですか? ファイルの出力速度もダウンロード速度もある程度は計算で出せるはずです。 回線速度と比較してどのくらい出ているのか調べて、やはり遅いようであれば、ブラウザ等の設定を疑ってみては? FTPでも遅いのであれば、回線がおかしいのでしょう。 基本的にはHTTPとFTPはそれほど転送速度に差があるとは思えませんので。

saekija
質問者

お礼

やはり回線速度 VS LINUXマシンのクロック数になるんですね。 大きなファイルはダウンロードしないようにします。

関連するQ&A