cakephpでバルクインサート

大量のデータを一度にインサートできるバルクインサート。
cakephpでも出来ます。

MySQLで一度に複数のデータをインサートするには下の文でできます。
INSERT INTO table_name (col_1, col_2, col_3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);




cakephp で行うには、queryメソッドを使用します。
$this->Model->query($sql, $params,false);

queryメソッドに、第2引数を指定してプレースホルダ機能を使います。
$sql = “INSERT INTO table_name (col_1, col_2, col_3) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?)”;
$params = array(0=>”1″,1=>”2″,2=>”3″,3=>”4,4=>”5″,5=>”6″,6=>”7″,7=>”8″8=>”9″);

第3引数は、キャッシュを使用するならtrueです。

一度にインサートできるデータ量に注意が必要です。
Mysqlでクライアントからサーバに送ることができるパケットは、max_allowed_packetに設定されています。
これを超えてしまうと、エラーになります。
show variables like ‘max_allowed_packet’;
で確認することができる。
さくらの共有サーバでは、この値を自分で変更できないようですが、16MBに設定されていました。



空のテーブルに10000件登録したところ、バルクインサートの方が5倍程度速かったです。