關(guān)于PHP往mysql數(shù)據(jù)庫(kù)中批量插入數(shù)據(jù)實(shí)例教程
文章主要給大家介紹了關(guān)于php往mysql中批量插入數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧...
文章主要給大家介紹了關(guān)于php往MySQL中批量插入數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
前言
假如說(shuō)我有這樣一個(gè)表,我想往這個(gè)表里面插入大量數(shù)據(jù)?
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循環(huán)插入
在往mysql插入少量數(shù)據(jù)的時(shí)候,我們一般用for循環(huán)?
$arr= [['name'=>'testname1','age'=> 18,],['name'=>'testname2','age'=> 19,],['name'=>'testname3','age'=> 18,],];$servername="localhost";$port= 3306;$username="username";$password="password";$dbname="mytestdb";// 創(chuàng)建連接$conn=newmysqli($servername,$username,$password,$dbname,$port);// 檢測(cè)連接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();
假如說(shuō)要批量插入大量數(shù)據(jù),如果還用for循環(huán)的辦法插入是沒(méi)有問(wèn)題的,只是時(shí)間會(huì)比較長(zhǎng)。
對(duì)比一下插入少量數(shù)據(jù)與插入大量數(shù)據(jù),使用上面的for循環(huán)插入耗費(fèi)的時(shí)間:
| 條數(shù) | 時(shí)間 (單位:秒) |
|---|---|
| 10 | 0.011 |
| 1000 | 0.585 |
| 10000 | 5.733 |
| 100000 | 60.587 |
方法二、使用insert語(yǔ)句合并插入
mysql里面是可以使用insert語(yǔ)句進(jìn)行合并插入的,比如
INSERT INTO user_info (name, age) VALUES ('name1', 18), ('name2', 19);表示一次插入兩條數(shù)據(jù)
下面看示例代碼,看看不同數(shù)據(jù)條數(shù)下?
$arr= [['name'=>'testname1','age'=> 18,],['name'=>'testname2','age'=> 19,],['name'=>'testname3','age'=> 18,],// 此處省略…………];$servername="localhost";$port= 3306;$username="username";$password="password";$dbname="mytestdb";// 創(chuàng)建連接$conn=newmysqli($servername,$username,$password,$dbname,$port);// 檢測(cè)連接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;}// 去除最后一個(gè)逗號(hào),并且加上結(jié)束分號(hào)$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();
下面看一下少量數(shù)據(jù)與大量數(shù)據(jù)的時(shí)間對(duì)比。從總體時(shí)間上,可以看出insert合并插入比剛才for循環(huán)插入節(jié)約了很多時(shí)間
| 條數(shù) | 時(shí)間 (單位:秒) |
|---|---|
| 10 | 0.006 |
| 1000 | 0.025 |
| 10000 | 0.131 |
| 100000 | 1.23 |
當(dāng)然,如果你覺(jué)得數(shù)組太大,想要減少sql錯(cuò)誤的風(fēng)險(xiǎn),也可以使用array_chunk將數(shù)組切成指定大小的塊,然后對(duì)每個(gè)塊進(jìn)行insert合并插入
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值。
- MyBatis SQL數(shù)據(jù)庫(kù)xml處理小于號(hào)與大于號(hào)正確的格式
- SQL Server數(shù)據(jù)庫(kù)中分頁(yè)編號(hào)的另一種方式
- SQL數(shù)據(jù)庫(kù)中Truncate的用法
- Sql Server數(shù)據(jù)庫(kù)的一些知識(shí)點(diǎn)定義和總結(jié)
- Win10系統(tǒng)服務(wù)器安裝MySQL8.0.13遇到的問(wèn)題及解決方法
- Php兩點(diǎn)地理坐標(biāo)距離的計(jì)算方法和具體代碼
- PHP獲取HTTP body內(nèi)容的方法
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中獲取對(duì)象屬性的3種方法實(shí)例分析
- php5.5新增的yield關(guān)鍵字功能與相關(guān)使用技巧
- Windows7下IIS+php配置教程詳細(xì)介紹
MyBatis SQL數(shù)據(jù)庫(kù)xml處理小于號(hào)與大于號(hào)正確的格式
文章主要介紹了MyBatis SQL xml處理小于號(hào)與大于號(hào)正確的格式,需要的朋友可以參考下 當(dāng)我們需要通過(guò)xml格式處理sql語(yǔ)句時(shí),經(jīng)常會(huì)用到< ,<=,>,>=等符號(hào),但是很容易引起xml格式的錯(cuò)誤,這樣會(huì)導(dǎo)致后臺(tái)將xml字符串轉(zhuǎn)換為xml文檔時(shí)報(bào)錯(cuò),從而導(dǎo)致程序錯(cuò)誤。...
SQL Server數(shù)據(jù)庫(kù)中分頁(yè)編號(hào)的另一種方式
文章主要介紹了SQL Server 分頁(yè)編號(hào)的另一種方式,需要的朋友可以參考下今天看書(shū)講T-SQL,看到了UNBOUNDED PRECEDING,就想比對(duì)下ROW_NUMBER()的運(yùn)行速度。...
SQL數(shù)據(jù)庫(kù)中Truncate的用法
runcate是一個(gè)能夠快速清空資料表內(nèi)所有資料的SQL語(yǔ)法。這篇文章主要介紹了SQL中Truncate的用法,需要的朋友可以參考下...
Sql Server數(shù)據(jù)庫(kù)的一些知識(shí)點(diǎn)定義和總結(jié)
文章主要給大家總結(jié)介紹了關(guān)于Sql Server的一些知識(shí)點(diǎn)定義文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)...
Win10系統(tǒng)服務(wù)器安裝MySQL8.0.13遇到的問(wèn)題及解決方法
文章主要介紹了Win10系統(tǒng)安裝MySQL8.0.13遇到的問(wèn)題及解決方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下...
Php兩點(diǎn)地理坐標(biāo)距離的計(jì)算方法和具體代碼
文章主要為大家詳細(xì)介紹了php兩點(diǎn)地理坐標(biāo)距離的計(jì)算方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下php計(jì)算兩點(diǎn)地理坐標(biāo)距離的具體代碼,具體內(nèi)容如下功能:根據(jù)圓周率和...
PHP獲取HTTP body內(nèi)容的方法
今天小編就為大家分享一篇PHP獲取HTTP body內(nèi)容的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧有時(shí)候我們獲取數(shù)據(jù)時(shí)需要根據(jù)Header中的格式來(lái)解析,比...
PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中獲取對(duì)象屬性的3種方法實(shí)例分析
文章主要介紹了PHP獲取對(duì)象屬性的三種方法,結(jié)合實(shí)例形式分析了php面向?qū)ο蟪绦蛟O(shè)計(jì)中獲取對(duì)象屬性的常見(jiàn)操作技巧,需要的朋友可以參考下。PHP獲取對(duì)象屬性的三種方法,具體如下...
php5.5新增的yield關(guān)鍵字功能與相關(guān)使用技巧
文章主要介紹了PHP yield關(guān)鍵字功能與用法,結(jié)合實(shí)例形式分析了php5.5新增的yield關(guān)鍵字功能與相關(guān)使用技巧,需要的朋友可以參考下實(shí)例講述PHP yield關(guān)鍵字功能與用法具體如下:y...
Windows7下IIS+php配置教程詳細(xì)介紹
文章主要為大家詳細(xì)介紹了Windows7下IIS+php配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

