關于PHP往mysql數據庫中批量插入數據實例教程
文章主要給大家介紹了關于php往mysql中批量插入數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧...
文章主要給大家介紹了關于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=- '用戶信息表'- ;
批量插入
方法一、使用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循環插入耗費的時間:
| 條數 | 時間 (單位:秒) | 
|---|---|
| 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- =- 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- =- '( '- ;
- $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合并插入
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值。
  - MyBatis SQL數據庫xml處理小于號與大于號正確的格式- 文章主要介紹了MyBatis SQL xml處理小于號與大于號正確的格式,需要的朋友可以參考下 當我們需要通過xml格式處理sql語句時,經常會用到< ,<=,>,>=等符號,但是很容易引起xml格式的錯誤,這樣會導致后臺將xml字符串轉換為xml文檔時報錯,從而導致程序錯誤。... 
  - SQL Server數據庫中分頁編號的另一種方式- 文章主要介紹了SQL Server 分頁編號的另一種方式,需要的朋友可以參考下今天看書講T-SQL,看到了UNBOUNDED PRECEDING,就想比對下ROW_NUMBER()的運行速度。... 
  - SQL數據庫中Truncate的用法- runcate是一個能夠快速清空資料表內所有資料的SQL語法。這篇文章主要介紹了SQL中Truncate的用法,需要的朋友可以參考下... 
  - Sql Server數據庫的一些知識點定義和總結- 文章主要給大家總結介紹了關于Sql Server的一些知識點定義文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習... 
  - Win10系統服務器安裝MySQL8.0.13遇到的問題及解決方法- 文章主要介紹了Win10系統安裝MySQL8.0.13遇到的問題及解決方法,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下... 
  - Php兩點地理坐標距離的計算方法和具體代碼- 文章主要為大家詳細介紹了php兩點地理坐標距離的計算方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下php計算兩點地理坐標距離的具體代碼,具體內容如下功能:根據圓周率和... 
  - PHP獲取HTTP body內容的方法- 今天小編就為大家分享一篇PHP獲取HTTP body內容的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧有時候我們獲取數據時需要根據Header中的格式來解析,比... 
  - PHP面向對象程序設計中獲取對象屬性的3種方法實例分析- 文章主要介紹了PHP獲取對象屬性的三種方法,結合實例形式分析了php面向對象程序設計中獲取對象屬性的常見操作技巧,需要的朋友可以參考下。PHP獲取對象屬性的三種方法,具體如下... 
  - php5.5新增的yield關鍵字功能與相關使用技巧- 文章主要介紹了PHP yield關鍵字功能與用法,結合實例形式分析了php5.5新增的yield關鍵字功能與相關使用技巧,需要的朋友可以參考下實例講述PHP yield關鍵字功能與用法具體如下:y... 
  - Windows7下IIS+php配置教程詳細介紹- 文章主要為大家詳細介紹了Windows7下IIS+php配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下... 

