第一種方法一條一條執行插入,結果會很慢
<?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)然后重啟環境就可以了