当前位置:首页 > PHP教程 > php应用 > 列表

php往mysql中批量插入数据实例教程

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-02 10:35:49 浏览: 评论:0 

这篇文章主要给大家介绍了关于php往mysql中批量插入数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

假如说我有这样一个表,我想往这个表里面插入大量数据

  1. CREATE TABLE IF NOT EXISTS `user_info` ( 
  2.  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键'
  3.  `namevarchar(255) NOT NULL default '' COMMENT '姓名'
  4.  `age` int(11) NOT NULL default '0' COMMENT '年龄'
  5.  PRIMARY KEY (`id`) 
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表'

批量插入

方法一、使用for循环插入

在往mysql插入少量数据的时候,我们一般用for循环

  1. $arr = [     
  2.     [ 
  3.         'name' => 'testname1'
  4.         'age' => 18, 
  5.     ], 
  6.     [ 
  7.         'name' => 'testname2'
  8.         'age' => 19, 
  9.     ], 
  10.     [ 
  11.         'name' => 'testname3'
  12.         'age' => 18, 
  13.     ], 
  14. ]; 
  15.  
  16. $servername = "localhost"
  17. $port = 3306; 
  18. $username = "username"
  19. $password = "password"
  20. $dbname = "mytestdb"
  21.  
  22. // 创建连接 
  23. $conn = new mysqli($servername$username$password$dbname$port); 
  24.  
  25. // 检测连接 
  26. if ($conn->connect_error) { 
  27.  die("connect failed: " . $conn->connect_error); 
  28. }  
  29.  
  30. $costBegin = microtime(true); 
  31.  
  32. foreach($arr as $item) { 
  33.     $sql = sprintf("INSERT INTO user_info (name, age) VALUES ( '%s', %d);"$item['name'], (int)$item['age']);    
  34.     if ($conn->query($sql) === TRUE) { 
  35.      echo "insert success"
  36.     } else { 
  37.      echo "Error: " . $sql . "<br>" . $conn->error; 
  38.     } 
  39.  
  40. $costEnd = microtime(true); 
  41. $cost = round($costEnd - $costBegin, 3); 
  42. var_dump($cost); 
  43.  
  44. $conn->close(); 

假如说要批量插入大量数据,如果还用for循环的办法插入是没有问题的,只是时间会比较长。

对比一下插入少量数据与插入大量数据,使用上面的for循环插入耗费的时间:

条数 时间 (单位:秒)

  1. 10 0.011 
  2. 1000 0.585 
  3. 10000 5.733 
  4. 100000 60.587 

方法二、使用insert语句合并插入

mysql里面是可以使用insert语句进行合并插入的,比如

INSERT INTO user_info (name, age) VALUES ('name1', 18), ('name2', 19);表示一次插入两条数据

下面看示例代码,看看不同数据条数下

  1. $arr = [     
  2.     [ 
  3.         'name' => 'testname1'
  4.         'age' => 18, 
  5.     ], 
  6.     [ 
  7.         'name' => 'testname2'
  8.         'age' => 19, 
  9.     ], 
  10.     [ 
  11.         'name' => 'testname3'
  12.         'age' => 18, 
  13.     ], 
  14.     // 此处省略 
  15.     …… 
  16.     …… 
  17. ]; 
  18.  
  19. $servername = "localhost"
  20. $port = 3306; 
  21. $username = "username"
  22. $password = "password"
  23. $dbname = "mytestdb"
  24.  
  25. // 创建连接 
  26. $conn = new mysqli($servername$username$password$dbname$port); 
  27.  
  28. // 检测连接 
  29. if ($conn->connect_error) { 
  30.  die("connect failed: " . $conn->connect_error); 
  31. }  
  32.  
  33. $costBegin = microtime(true); 
  34.  
  35. if (!emptyempty($arr)) { 
  36.     $sql = sprintf("INSERT INTO user_info (name, age) VALUES "); 
  37.  
  38.     foreach($arr as $item) { 
  39.   $itemStr = '( '
  40.   $itemStr .= sprintf("'%s', %d"$item['name'], (int)$item['age']); 
  41.   $itemStr .= '),'
  42.   $sql .= $itemStr
  43.   } 
  44.  
  45.  // 去除最后一个逗号,并且加上结束分号 
  46.  $sql = rtrim($sql','); 
  47.  $sql .= ';'
  48.  
  49.     if ($conn->query($sql) === TRUE) { 
  50.     } else { 
  51.      echo "Error: " . $sql . "<br>" . $conn->error; 
  52.     } 
  53.  
  54. $costEnd = microtime(true); 
  55. $cost = round($costEnd - $costBegin, 3); 
  56. var_dump($cost); 
  57.  
  58. $conn->close(); 

下面看一下少量数据与大量数据的时间对比。从总体时间上,可以看出insert合并插入比刚才for循环插入节约了很多时间

条数 时间 (单位:秒)

  1. 10 0.006 
  2. 1000 0.025 
  3. 10000 0.131 
  4. 100000 1.23 

当然,如果你觉得数组太大,想要减少sql错误的风险,也可以使用array_chunk将数组切成指定大小的块,然后对每个块进行insert合并插入。

Tags: mysql批量插入

分享到: