文章主要給大家介紹了關于php往MySQL中批量插入數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
前言
假如說我有這樣一個表,我想往這個表里面插入大量數據?
CREATETABLEIFNOTEXISTS `user_info` (`id`int(11)NOTNULLAUTO_INCREMENT COMMENT'自增主鍵',`name`varchar(255)NOTNULLdefault''COMMENT'姓名',`age`int(11)NOTNULLdefault'0'COMMENT'年齡',PRIMARYKEY(`id`)) ENGINE=InnoDBDEFAULTCHARSET=utf8 COMMENT='用戶信息表';
批量插入
方法一、使用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=newmysqli($servername,$username,$password,$dbname,$port);// 檢測連接if($conn->connect_error) {die("connect failed: ".$conn->connect_error);}$costBegin= microtime(true);foreach($arras$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循環插入耗費的時間:
| 條數 | 時間 (單位:秒) |
|---|---|
| 10 | 0.011 |
| 1000 | 0.585 |
| 10000 | 5.733 |
| 100000 | 60.587 |
方法二、使用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=newmysqli($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($arras$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();
下面看一下少量數據與大量數據的時間對比。從總體時間上,可以看出insert合并插入比剛才for循環插入節約了很多時間
| 條數 | 時間 (單位:秒) |
|---|---|
| 10 | 0.006 |
| 1000 | 0.025 |
| 10000 | 0.131 |
| 100000 | 1.23 |
當然,如果你覺得數組太大,想要減少sql錯誤的風險,也可以使用array_chunk將數組切成指定大小的塊,然后對每個塊進行insert合并插入
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值。
分享到:
投訴收藏














