ホームページ >バックエンド開発 >PHPチュートリアル >PHP はデータをバッチで mysql に挿入します (コード例)
このようなテーブルがあり、このテーブルに大量のデータを挿入したいとします。
CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `name` varchar(255) NOT NULL default '' COMMENT '姓名', `age` int(11) NOT NULL default '0' COMMENT '年龄', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
バッチ挿入
方法 1. for ループを使用して挿入
mysql に少量のデータを挿入する場合、通常は for ループ
$arr = [ [ 'name' => 'testname1', 'age' => 18, ], [ 'name' => 'testname2', 'age' => 19, ], [ 'name' => 'testname3', 'age' => 18, ], ]; $servername = "localhost"; $port = 3306; $username = "username"; $password = "password"; $dbname = "mytestdb"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname, $port); // 检测连接 if ($conn->connect_error) { die("connect failed: " . $conn->connect_error); } $costBegin = microtime(true); foreach($arr as $item) { $sql = sprintf("INSERT INTO user_info (name, age) VALUES ( '%s', %d);", $item['name'], (int)$item['age']); if ($conn->query($sql) === TRUE) { echo "insert success"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } } $costEnd = microtime(true); $cost = round($costEnd - $costBegin, 3); var_dump($cost); $conn->close();
を使用します。
大量のデータを一括で挿入したい場合は、for ループを併用して挿入しても問題ありませんが、時間がかかります。少量のデータを挿入する場合と、大量のデータを挿入する場合にかかる時間を比較してください。上記の for ループを使用して、時間:項目数 (単位:秒)
# を挿入します。
##方法 2: insert ステートメントを使用してマージと挿入を行う
mysql では、insert ステートメントを使用してマージと挿入を行うことができます。INSERT INTO user_info (name, age) VALUES ('name1', 18), ('name2', 19);表示一次插入两条数据 $arr = [ [ 'name' => 'testname1', 'age' => 18, ], [ 'name' => 'testname2', 'age' => 19, ], [ 'name' => 'testname3', 'age' => 18, ], // 此处省略 …… …… ]; $servername = "localhost"; $port = 3306; $username = "username"; $password = "password"; $dbname = "mytestdb"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname, $port); // 检测连接 if ($conn->connect_error) { die("connect failed: " . $conn->connect_error); } $costBegin = microtime(true); if (!empty($arr)) { $sql = sprintf("INSERT INTO user_info (name, age) VALUES "); foreach($arr as $item) { $itemStr = '( '; $itemStr .= sprintf("'%s', %d", $item['name'], (int)$item['age']); $itemStr .= '),'; $sql .= $itemStr; } // 去除最后一个逗号,并且加上结束分号 $sql = rtrim($sql, ','); $sql .= ';'; if ($conn->query($sql) === TRUE) { } else { echo "Error: " . $sql . "<br>" . $conn->error; } } $costEnd = microtime(true); $cost = round($costEnd - $costBegin, 3); var_dump($cost); $conn->close();少量のデータと大量のデータの時間の比較を見てみましょう。全体の時間を見ると、先ほどの for ループの挿入に比べて、挿入マージ挿入の方が大幅に時間が節約されており、その効果が非常に明白であることがわかります。
#配列が大きすぎると考えられ、SQL エラーのリスクを軽減したい場合は、また、array_chunk を使用して、配列を指定したサイズのチャンクに分割し、ブロックごとに挿入マージ挿入を実行することもできます。
PHP 関連の知識の詳細については、
php チュートリアルをご覧ください。
以上がPHP はデータをバッチで mysql に挿入します (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。