ホームページ >バックエンド開発 >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 ループを使用します
(関連ビデオチュートリアル共有: php ビデオチュートリアル)
$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 ステートメントを使用してマージする 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 は、mysql へのデータのバッチ挿入を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。