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権限も必要になります。