ホームページ  >  記事  >  バックエンド開発  >  PHP はデータをバッチで mysql に挿入します (コード例)

PHP はデータをバッチで mysql に挿入します (コード例)

藏色散人
藏色散人転載
2020-01-31 19:18:103478ブラウズ

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 ループを使用して、時間:項目数 (単位:秒)

PHP はデータをバッチで mysql に挿入します (コード例)

# を挿入します。

##方法 2: 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 ループの挿入に比べて、挿入マージ挿入の方が大幅に時間が節約されており、その効果が非常に明白であることがわかります。

PHP はデータをバッチで mysql に挿入します (コード例)

#配列が大きすぎると考えられ、SQL エラーのリスクを軽減したい場合は、また、array_chunk を使用して、配列を指定したサイズのチャンクに分割し、ブロックごとに挿入マージ挿入を実行することもできます。

PHP 関連の知識の詳細については、

php チュートリアル

をご覧ください。

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

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