PHP實現插入100萬條數據優化


第一種方法一條一條執行插入,結果會很慢

<?php


header("Content-Type:text/html;charset=utf-8");
date_default_timezone_set("PRC");
$servername = "localhost";
$port = 3306;
$username = "root";
$password = "root";
$dbname = "charu";

// 創建數據庫連接
$conn = new mysqli($servername, $username, $password, $dbname, $port);

// 檢測連接
if ($conn->connect_error) {
 die("connect failed: " . $conn->connect_error);
} 

// 第一種,一條一條插入,結果要2分多鍾
$costBegin = time();
echo date('Y-m-d H:s:i',$costBegin)."<br>";
for($i=0;$i<1000000;$i++){
    $sql = sprintf("INSERT INTO charu (name, age) VALUES ( '%s', %d);", '測試', 10);
    $conn->query($sql);
}

$costEnd = time();
echo date('Y-m-d H:s:i',$costEnd)."<br>";
$cost = $costEnd - $costBegin;
echo date('Y-m-d H:s:i',$cost)."<br>";

$conn->close();

 

第二種使用insert合並插入

mysql里面是可以使用insert語句進行合並插入的,比如

INSERT INTO charu (name, age) VALUES ('name1', 18), ('name2', 19);

表示一次插入兩條數據

 

<?php


header("Content-Type:text/html;charset=utf-8");
date_default_timezone_set("PRC");
$servername = "localhost";
$port = 3306;
$username = "root";
$password = "root";
$dbname = "charu";

// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname, $port);

// 檢測連接
if ($conn->connect_error) {
 die("connect failed: " . $conn->connect_error);
} 

// 第二種,把所有要插入的數據生成為一條sql語句,所以執行的時間會快很多,測試時間是5秒多,服務器配置不同會影響時間
$costBegin = time();
echo date('Y-m-d H:s:i',$costBegin)."<br>";
$sql = sprintf("INSERT INTO charu (name, age) VALUES ");
for($i=0;$i<1000000;$i++){
      $itemStr = '( ';
      $itemStr .= sprintf("'%s', %d", '測試', 10);
      $itemStr .= '),';
      $sql .= $itemStr;
}
// 去除最后一個逗號,並且加上結束分號
$sql = rtrim($sql, ',');
$sql .= ';';
if ($conn->query($sql) === TRUE) {
    echo "新記錄插入成功". "<br>";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$costEnd = time();
echo date('Y-m-d H:s:i',$costEnd)."<br>";
$cost = $costEnd - $costBegin;
echo date('Y-m-d H:s:i',$cost)."<br>";

$conn->close();

使用第二種方法有可能會出現

MySQL server has gone away錯誤的解決辦法

而我自己是直接在my.ini文件里面直接添加(max_allowed_packet = 30M)然后重啟環境就可以了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM