PHPで配列に格納された会員IDの値を、MySQL上のテーブルに一括登録したいと思います。


今まではforを使って1件ずつ登録していたのですが、これだと1万件以上登録させようとすると、
処理に時間がかかってしまいます。

出来るだけ処理時間がかからないSQL文の書き方を、教えていただければと思います。

MySQLは4.1.22で、対象テーブル(user_log)のストレートエンジンはMyISAMです。
登録させようと思っているのは、会員ID(user_id)の他に、登録時間(date)と
PHPで生成した識別コード(code)を登録します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/02/21 12:35:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント35pt

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 5.2.10 INSERT クエリの速度

INSERT の効率化については上記のページにすべてまとまっています。


ファイルからのロードが圧倒的に早いですが、あくまで SQL でやろうと思うと

マルチプルインサートが妥当かと。

id:tomo_k No.2

回答回数426ベストアンサー獲得回数26

ポイント35pt

http://dev.mysql.com/doc/refman/4.1/ja/mysqlimport.html

一番早いと思われる方法はPHPの配列にある情報をいったんテキストファイルに出力しLOAD DATAを使うことだと思います。

http://phpdoc.m-takagi.org/mysqli.set-local-infile-handler.html

http://q.hatena.ne.jp/1144055939

このあたりが参考になるかもしれません。

id:kt26

LOAD DATAが良さそうだったので、以下(コメント欄)のソースを書きました。しかし、上手く登録出来ません。

この点について、ソースの指摘等がありましたら、お願いします。

2008/02/14 14:18:26
  • id:kt26
    tomo_kさんの回答より、LOAD DATAを使う為に以下のソースを書きました。しかし、正しく登録されません。
    もし、ご存じの方は、回答にてご指摘いただければ幸いです。


    $array = array("1","2","3","4","5","6","7","8","9","10");
    for($i=0;$i<count($array);$i++){
    $write .= '"'.$array[$i].'","'. date('Y-m-d H:i:s').'"'."\n";
    }
    // 登録用CSVファイルを作成
    $fp = fopen("log.csv","w");
    fwrite($fp,"$write");
    fclose($fp);

    // SQLを実行
    $sql = "LOAD DATA INFILE 'log.csv' INTO TABLE 'user_log' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'";
    mysql_query($sql,$con);

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません