ホームページ  >  記事  >  バックエンド開発  >  PHP は、mysql へのデータのバッチ挿入を実装します。

PHP は、mysql へのデータのバッチ挿入を実装します。

王林
王林転載
2020-01-31 21:46:484295ブラウズ

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 ループを使用して挿入するのにかかる時間: アイテム数時間 (単位: 秒)

PHP は、mysql へのデータのバッチ挿入を実装します。

方法 2. insert ステートメントを使用してマージする Insert

mysql では、insert ステートメントを使用してマージと挿入を行うことができます。たとえば、

INSERT INTO user_info (name, age) VALUES (&#39;name1&#39;, 18), (&#39;name2&#39;, 19);表示一次插入两条数据

$arr = [ 
[
&#39;name&#39; => &#39;testname1&#39;,
&#39;age&#39; => 18,
],
[
&#39;name&#39; => &#39;testname2&#39;,
&#39;age&#39; => 19,
],
[
&#39;name&#39; => &#39;testname3&#39;,
&#39;age&#39; => 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 = &#39;( &#39;;
$itemStr .= sprintf("&#39;%s&#39;, %d", $item[&#39;name&#39;], (int)$item[&#39;age&#39;]);
$itemStr .= &#39;),&#39;;
$sql .= $itemStr;
}

// 去除最后一个逗号,并且加上结束分号
$sql = rtrim($sql, &#39;,&#39;);
$sql .= &#39;;&#39;;

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 は、mysql へのデータのバッチ挿入を実装します。

おすすめの関連記事とチュートリアル:

php チュートリアル

以上がPHP は、mysql へのデータのバッチ挿入を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。