insertを高速化させたい

このQ&Aのポイント
  • 20件程度の情報をテーブルにinsertするのに、30秒以上かかる問題について。
  • Windows XPとMYSQL(TABLE1のidにはindexつき)の環境で発生しています。
  • DBにinsertせずにテキストファイルに書き込む方法では一瞬で挿入が完了しますが、DBに書き込む際には高速化を図りたいです。
回答を見る
  • ベストアンサー

insertを高速化させたい

問題:insertが遅い。20件程度の情報をテーブルにinsertするのに、30秒以上かかる。 環境:Windows XP, MYSQL(TABLE1のidにはindexつき) 仕様:textdata.csvを開き、idを取得する。取得したidをgetid変数に入れる。    取得したidがTABLE1に無いか調べる。idが無ければinsert。    あれば読み飛ばす。textdata.csvのidが無くなれば終わり。 con = CREATEOLEOBJ("ADODB.Connection") //ここでCSVファイルを開き、idを取得しループさせる getidSQL = "Select * from TABLE1 where id = '" + getid + "';" RS = con.Execute(getidSQL) If RS.EOF Then //DB登録--------------------------------------------------------------------------------------- str = "INSERT INTO TABLE1 (id) values('" + getid + "');" con.Execute(str) //DB登録終了------------------------------------------------------------------------------------ endif //CSVループ ちなみに、DBにinsertせずに、かわりにテキストファイルに書き込む方法だと一瞬で挿入が完了します。 これをDBに書き込む時に高速化を図りたいのですが、何か良い方法はないでしょうか?

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

総データ数、インデックスの設定、ユニークやプライマリの設定によって ことなりますが、 >idが無ければinsert。 >あれば読み飛ばす という仕様であれば、idにユニークを設定し、 INSERT IGNORE INTO TABLE1 (id) values(・・・) で十分ですね

mellow91
質問者

お礼

insert ignoreというのは知りませんでした。一度試してみたいと思います、ありがとうございます!!

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

「id」にインデックス作成してありますか。INSERTに時間かかっているというよりidが同一のレコード検索に時間がかかっている気がするのですが。 解決策は#1さんの書かれているのが一番簡単かなと思います。

mellow91
質問者

お礼

#1様にご回答頂いたignoreというのを知らなかったので、こちらでやってみます。ありがとうございます!

回答No.2

極端に遅すぎます。 仕様や考え方がどうのではなくて、冗長な処理が混じっていると思います。 CSVを読み込むところから、まずはロジックを見直した方がいいです。 その上で高速化を検討してください。

mellow91
質問者

お礼

はい、極端に遅すぎると思っていました。もう一度コードを精査してみます。ありがとうございます!

関連するQ&A

  • 連続で実行するには?

    下のように、PostgreSQL に接続して insert を実行するプログラムを書いたのですが、 これらの3つのinsert 文を一気に実行してしまいたい場合、どうすればよいのでしょうか? // insert $sql = "insert into area values (1,'中央区')"; $sql = "insert into area values (2,'東区'); $sql = "insert into area values (3,'西区'); //ここより本文です。 <?php // connect $db_con = pg_connect("","","fuk_gourmet"); if($db_con == false) {print "cannot connect"; exit;} // insert (これだと一つしか実行できない) $sql = "insert into area values (1,'中央区')"; // execute $rs = pg_exec($db_con, $sql); if($rs == false) {print "execute error"; exit;} pg_freeresult($rs); pg_close($db_con); ?>

    • ベストアンサー
    • PHP
  • ADO(js) insert into高速化

    ADO素人です。色々検索したのですが、見つからず質問いたします。 仕事場にてjavascript,ADO,mdb,XP,IE6を使用しDBを作成しております。 mdbのデータを加工しcsv出力しようと思っているのですが、非常に遅く困っております。 単純に、以下のコードで100件出力しても4秒ほどかかります。 環境的に上記を使用するしかない状況で、高速化するにはどのようにすればいいのでしょうか。 どなたか、何卒ご教示お願いいたします。 var dbobj = new ActiveXObject("ADODB.Connection"); dbobj.open("Driver={Microsoft Access Driver (*.mdb)};DBQ=e:db1.mdb;") for(var i=0:i<100;i++){ dbobj.Execute("insert into [Text;Database=e:;].[test.csv] (aaa) values('1111');"); } dbobj.close(); 上記を実行すると4秒ほどかかります。 実際はfield数20、300行ほどです。 出力データを新しいtableに作成し、そこから select * into [CSVファイル] from table作成 にすれば1秒かかりません。 が、例のようにループで出力したいと思っております。 お忙しいところ大変お手数ではございますが、どうぞよろしくお願いいたします。

  • 効率のよい方法があったらお教え下さい

    下記の仕様を元にAccessでプログラムを組もうと考えています。 「プログラムをするにあたっての方法」のように組もうと考えているのですが、効率が悪いように何となく感じています。 もし、こういった方法でプログラムしたらという方法がありましたらお教え下さい。 ------------------------------------------------------- 仕様 ------------------------------------------------------- TABLE1とTABLE2があります。 TABLE1は履歴蓄積テーブル。 TABLE2は新規インサート用テーブルです。 両テーブルともにIDフィールドがあります。 TABLE1に取得IDが無ければ、TABLE2にインサート。 TABLE1に取得IDが存在すれば、TABLE2にインサートをおこなわない。 取得IDはテキストファイルにあります。 ------------------------------------------------------- プログラムをするにあたっての方法 ------------------------------------------------------- TABLE1のレコードセットを取得 取得IDをキーにTABLE1のレコードセット・IDフィールドを検索 取得IDがレコードセットに無ければ Insert文でTABLE2に挿入 取得IDがレコードセットに有れば Insertをおこなわない テキストのIDがEOFになるまで繰り返し 終わり

  • ACCESS2007 VBA 「INSERT INTO~」について

    ACCESS2007を使用しています。 VBAにて、下記の内容を記述しています。(前後は略しています) 特にエラーも出ていなくて、最後まできちんと実行されるのですが、顧客マスタにデータが追加されません。 strSQL = "INSERT INTO 顧客マスタ(得意先ID,得意先名,得意先名カナ,郵便番号,住所,電話番号,FAX番号) " & _ "VALUES(" & tID & ",'" & rs!顧客名 & "','" & rs!カナ & "','" & rs!郵便番号 & "','" & rs!住所 & "','" & rs!電話番号 & "','" & rs!FAX & "');" db.Execute strSQL イミディエイトウィンドウで、strSQLの内容を表示してみたら、下記のようになりました。 特におかしな所もなく、テーブル名も正しいです。 INSERT INTO 顧客マスタ(得意先ID,得意先名,得意先名カナ,郵便番号,住所,電話番号,FAX番号) VALUES(9265,'テスト顧客','テスト','5555555','テスト住所','111-111-1111','222-222-2222'); その他にも、「INSERT INTO~」を使ってテーブルにデータを追加していますが、それはちゃんと追加されていて、なぜか顧客マスタのみ追加されません。 エラーも出ないので解決できなくて困っています。 よろしくお願いします。

  • 他のPHPで計算して出した値をPHP内で実行したい

    http://hoge.jp/data.php?id=7203をクーロンで叩くと、 その時間の株価情報を拾ってきて、WEB上に「7203,トヨタ,3080」 と表示される仕組みを作りました。(株価番号,社名,株価) この結果をmySQLのテーブルに継続的にインサートすることを考えました。 私が考えた方法は下記の通りなのですが、<?php ?> の中に<?php ?>が 含まれる形になるためか下記の方法ではインサートできません。 どのようにすればインサート出来るかご教授頂けませんでしょうか? 尚、「7203」「トヨタ」「3080」を別々に取得することはできず 「7203,トヨタ,3080」のようにまとまった形でしか取得できません。 宜しくお願い致します。 <?php $con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("db", $con); mysql_query(" INSERT INTO table (id,company,stock_price) values (<?php echo file_get_contents('http://hoge.jp/data.php?id=7203'); ?>) "); $close_flag = mysql_close($con); ?>

    • ベストアンサー
    • MySQL
  • oracle10g java jdbc 大量insertの高速化

    oracle10g java jdbc 大量insertの高速化 以下のプログラムで1万件処理したところ30秒ぐらいかかりました。 まだ高速化の余地があると思うのですが、何かいい方法はありませんでしょうか? String sql = "INSERT INTO TEST3 VALUES(?,?)"; PreparedStatement ps = con.prepareStatement(sql); while(rs5.next()){ int id = rs5.getInt(1); String line = rs5.getString(2); ps.setInt(1,id); ps.setString(2,line); ps.addBatch(); } ps.executeBatch();

    • ベストアンサー
    • Java
  • Insertの構文を教えて下さい

    こんばんわ。 いつもお世話になっております。 Insertの構文が分からず悩んでいます。 ご教授頂きたいと思います。 テーブルAはID,SOLD,NAMEの項目なのですが このテーブルAにSOLDに「1」をNAMEはテーブルAの検索結果をそのままInsertしたいのですが、以外に調べても載っておらず 困っています。 stmt.setString(2,1); stmt.setString(3,"NAME"); stmt.executeUpdate("INSERT INTO A values ('',?,?) WHERE id= "+Str);IDはオートナンバー型なのでテーブルの通番に従いたいと思います。 上記、記述でコンパイルするとエラーが出ます。 おかしい点をご教授下さい。 お願い致します!

    • ベストアンサー
    • Java
  • insertがうまくいかない

    PHP5+MYSQLの環境で $sql_str = "INSERT INTO bbs(userid,toukouid,groupid,title,memo) VALUES('$name','$toukouid','$group','$title','$memo')"; mysql_query($sql_str, $con_id); を実行しますが、登録ができません。 mysql_queryの結果がfalseです・・・。 ちなみに変数は全て1が代入しています。 悪いところあれば指摘お願いいたします。 また、他の情報が必要であればもうしつけください。

    • 締切済み
    • PHP
  • 異なるデータベース間のリレーション

    phpmyadmin上の異なるデータベース間のテーブルでリレーションをかけたいのですが、うまくいきません。 new_linkフラグをtrueにすることで異なるデータベースを開くところまではできました。 アドバイスいただけないでしょうか。 ※DB1の中にtable1が、DB2の中にtable2がある //失敗する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql = "select * from table1,table2 where table1.id = table2.id"; $result = mysql_query($sql) or die(mysql_error()); メッセージ⇒Table 'DB2.table1' doesn't exist //これは成功する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql1 = "select * from table1"; $result1 = mysql_query($sql,$con1) or die(mysql_error()); $sql2 = "select * from table2"; $result2 = mysql_query($sql2,$con2) or die(mysql_error());

    • ベストアンサー
    • MySQL
  • 入力値と外部キーをINSERTするには

    追加したいカラムが3つあるとしまして、そのうち2つはフォームからの入力値で、残り1つは別テーブルのIDをWHEREで引っ張ってきてINSERTしたい場合、INSERT...VALUES()とINSERT...SELECT構文を組み合わせないとダメかと思うのですが、組み合わせるとうまくいきません。2つの文に分けるしかないのでしょうか? やりたいことは下の感じのSQLです。が、解釈してくれません。 INSERT INTO room(A, B, C) VALUES (1, 2, SELECT other_table.id FROM other_table WHERE other_table.id = 1");

    • ベストアンサー
    • MySQL