• ベストアンサー

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

  • mysqlのcsvファイル出力について

    今jspファイルでボタンを押すとサーバーにあるデータベースの結果をcsvファイルとして保存するファイルを作りました。 今、作業用のパソコンからテラタームを使い、リモート接続で作業をしています。 なので出力するcsvファイルをサーバーの方ではなく、作業用のパソコンに落としたいのですが、方法はないですかね? 今はjspのほうでSELECT * FROM テーブル名 INTO OUTFILE のコマンドをmysqlに送っています。 phpmyadminで接続してそこからcsvファイルを落とすと閲覧しているパソコンに落ちるようになってるのでそ それができたらなと思います。 何かいい方法はないでしょうか? よろしくお願いします。

  • MySQLからCSVファイルのダウンロード

    はじめまして。 MySQLのデータをCSVファイルに書き出しダウンロードする場合に、 文字コードをSJISに変換してダウンロードしたいのですが、下記のソースに何を付け加えればできますでしょうか? お手数ですが、何方かご教授よろしくお願いします。 //tab1表から全行を取り出す $sql = "select * from tab1"; if(!$rs = mysql_query($sql)) { print "error=".mysql_errno()."<br>"; exit; } $fields = mysql_num_fields($rs); $rows = mysql_num_rows($rs); //取り出した行数分繰り返す for($i=0;$i<$rows;$i++){ //列数分繰り返す for($j=0;$j < $fields;$j++){ //列の内容出力する print(mysql_result($rs,$i,$j)); //最終列でない場合は カンマ を出力する if ($j < $fields - 1) print(","); } print("\n"); }

    • ベストアンサー
    • PHP
  • MacでCSV出力 Catで読み込むと0行

    Microsoft Excel for Mac 2011を利用しています。 Mac OSは10.10です。 CSV出力をして、Kシェルで処理をしたいのですが、うまくCSVファイルを読み込めないようです。 cat hoge.csv |wc -l をしてみると 0行になっています。 改行関連がおかしいのか、どうかわからない状態で、前にすすめません。 手打ちテキストを作成したシェルに読み込ませるとうまくいくのですが。。 どなたかご教授お願いいたします。

  • CSV出力スクリプトについて

    CSV出力のスクリプトを作成しました。 単純に1つのテーブルをそのままCSVで出力するだけです。 件数は60万件程度です。 問題は13,4件に1行改行されてしまいます。 この改行を省くことができるでしょうか? --CSV出力 -- set line 100 -- set echo off コマンド表示を抑止する -- set termout off 画面出力を抑止する -- set heading off 列タイトルの表示を抑止する -- set feedback off 結果メッセージの表示を抑止する -- set colsep ',' 列と列の区切りをカンマ(,)にする set line 100 set echo off set termout off set heading off set feedback off set colsep ',' /* spoolコマンドでファイル出力を開始する */ spool C:\tmp\sample.csv /* 問い合わせ結果がファイルtest.csvに出力される */ SELECT KAIIN_NO, STS_NO, SYOHIN_NO FROM SAMPLE; /* spool offでファイル出力を終了する */ spool off

  • PostgreSQL MySQL CSV入出力

    テーブルのデータを移植したいと思っています PostgreSQL8.4から出力したCSVをMySQL5.5で取り込みたいのですが、COPYコマンドを使用すると以下のようなエラーが出ます ERROR 1262 (01000): Row 1 was truncated; it contained more data than there were input columns PostgreSQLはtext[]型で"{A_1,A_2}"といったデータを出力します MySQLはPostgreSQLの配列に相当する型がないようなのでBlob型で格納しようと思っています おそらくデータ内のカンマが原因なのはわかっているのですが、上手くエクスポート・インポートする方法はありませんでしょうか?

    • ベストアンサー
    • MySQL
  • Ruby On RailsのCSV出力について

    Ruby On RailsでCSV出力を行うメソッドを作っているのですが、 そこで行いたいことは、 AA BB CC というデータがあったとして、 それぞれを AA.csv BB.csv CC.csv といった形でCSVデータを作成し、ブラウザにダウンロードのポップアップウィンドウを3回表示するという動きです。 ブラウザ上のボタン一つでこういった処理は可能なのでしょうか? なにか方法があれば教えていただきたいです。 無理なのであれば、なにかいい別の手段などを教えてください。 よろしくお願いします。

  • PHPでCSV出力したいです。

    phpを使ってCSVデータを出力したいです。 現在、DB内のデータ1行分(最終行)をCSV出力できているのですが 他の行のデータが出力されません。 まだまだphp初心者ですので知識のある方どうぞご助言ください。 以下、現在のソースです。 <?php require_once "Const.inc"; require_once "DBUtil.inc"; //DBコネクション取得 $db =& DBUtil::connect(); //クエリ生成 $query = "select ". "strfct.strfct_nm as nm, ". "emply.emply_id as id, ". "emply.emply_nm as nm2, ". "emply.pwd as pwd, ". "emply.e_strfct_id as sid ". "from ".      "emply ".  "inner join ". "strfct on strfct.strfct_id = emply.e_strfct_id "; $result = mysql_query($query); while($row99 = mysql_fetch_assoc($result)): $value_nm=$row99['nm']; $value_id=$row99['id']; $value_nm2=$row99['nm2']; $value_pwd=$row99['pwd']; $value_sid=$row99['sid']; $list = "\"" . $value_nm . "\",\"" . $value_id . "\",\"" . $value_nm2 . "\",\"" . $value_pwd . "\",\"" . $value_sid . "\"\n"; endwhile; mysql_free_result($result); $size = strlen($list); $filename = 'FCTDAT.csv'; //csvdll header("Content-Disposition: inline; filename=\"".basename($filename)."\""); header("Content-Length: ".$size); header("Content-Type: text/csv"); echo ($list); // DB切断 $db->disconnect(); ?> 以上のソースで原因と思われる部分はwhile文の中だと考えております。どうにかDB内のデータの全行を出力したいです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • コマンドの出力結果をn行おきに出力する方法

    コマンドの出力結果をn行おきに出力する、出来るだけシンプルな方法を知りたいです。 例えば、あるファイルの中身をgrepで絞込み、かつそれを5行ごとに出力させる等。 シェルの種類は問いません。 宜しくお願い致します。

  • PHP5+MySQL5 CSVから、更新、追加する処理の書き方

    こんにちは。 PHP5とMySQL5を使っています。 CSVファイルを読み込み、キーが存在するレコードは更新、 存在しなければ追加、という処理について 色々な書き方を教えて頂けたらと思います。 例えば、フィールドは、ユニークキーとなる[ID]、 [Name]、[TEL]の3つとします。 1.CSV読む 2.行と列の2次元配列に格納 3.行数分ループ開始 3-1.IDをキーに、SELECT 3-2.存在したら 3-3.UPDATE更新 3-2.存在しなかったら 3-3.INSERT追加 4.行数分ループ終了 と考えています。 CSVに100行あったら、100回SELECT掛けることになりますが、 この書き方で問題ないでしょうか? もっと判り易い、こんな書き方も! というのがありましたら、是非頂けますでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PostgreSQL MySQL CSV入出力

    timestamp型をCOPYコマンド出力する際ダブルクォーテーションでクォートしたい。 COPY (SELECT id, TOCHAR(date, 'YYYY-MM-DD hh:mm:ss'), names) FROM table) TO E'/export.txt' WITH CSV null'\\N'; これで出力すると以下のようなデータが吐かれる 1行目:1,2011-01-01 01:01:00,"{""A_01"",""A_02""}" 2行目:2,2011-01-02 02:02:00,{""A_03""} 配列外側の二重引用符は、要素が二つ以上のときのみ付く FORCE QUOTE id, date, names とすると日付の部分でエラーになる。