2006.06.06

MySQLでCSVファイルをデータベースに読み込むには

PHPアプリケーション上で、名前とメールアドレスのリストをCSVから
データベースに読み込む処理を作成した時に引っかかった事例を説明します。

当初考えていた方法は、

1.CSVファイルを一時ファイルとしてサーバにアップロード
2.CSVファイルから1行ずつ読み込みデータベースに読み込む

この方法の場合、1レコードずつInsert文を発行するため、
その都度オーバーヘッドが発生し4000行を超えたあたりで
PHPのタイムアウトエラー、もしくはメモリオーバー(標準で8MB)
によるエラーになってしまいます。

これを少しでも防ぐために、100件ずつInsert文を発行しましたが
多少は改善されたものの、やはり思ったほどのパフォーマンスが
得られませんでした。

何か良い方法がないかMySQLのリファレンスマニュアルを
見ていたところ、LOAD DATA INFILE構文を使えば、
ファイルから直接DBへ挿入する事ができるようで、
Insert文発行よりも何十倍も速いというコメントが
書いてありました。

試してみたところ、以前は何秒かかっても処理を終えることが
できなかったものがほんの2~3秒で処理できるようになり
一件落着となったわけです。

そこで一つ注意すべき点があります。
LOAD DATA INFILE構文を使用するには、対象のデータベースの
権限だけでなくサーバホストでのFILE権限も必要になります。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
nishimaki