php+mysql实现数据分批插入

上周需要将云端的数据有条件的录入到mysql中,最开始是使用遍历数据然后一条条的插入的笨方法,结果速度慢的要死,所以又随便写了个笨方法2.0,记录一下自己菜鸟的成长历程。同时这也是在博客园的第一篇文章,目的仅仅是单纯的记录一下自己的狗屎代码,因为我是菜鸟,哈哈。。。

比如说有10001条数据,每次插入1000条,分11次插入完成,代码如下:

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: Soup
 5  * Date: 2016/12/29
 6  * Time: 21:04
 7  */
 8
 9 $mysqli = new mysqli(‘localhost‘,‘root‘,‘123456‘,‘test‘);
10
11
12
13 if ($mysqli->connect_error) {
14     die(‘Connect Error (‘ . $mysqli->connect_errno . ‘) ‘
15         . $mysqli->connect_error);
16 }
17
18 /*
19  *@param $data array 要插入的数据
20  *@param $each int 每次插入的条数
21  */
22 function batchInsert($data,$each){
23
24     $num = count($data);        // 数据总数
25     $step = ceil( $num/$each);  // insert执行总次数
26
27
28     $j = 1;
29     $s = $step;
30
31     foreach ($data as $val){    // 目前仅仅是起到循环作用
32         if($j > $step) break;
33         $arr2 = array_slice($data, ($step - $s) * $each, $each);     // 每次取100条
34         $sql = "insert into batch VALUES ";
35         foreach($arr2 as $v){
36             $exist = $GLOBALS[‘mysqli‘]->query("select * from batch where number = ‘$v‘ limit 1 "); // 检查要插入的数据是否已存在
37             $row = $exist->fetch_array(MYSQLI_ASSOC);
38             if(empty($row)){
39                 $sql .= "(null,$v,now()),";     // 将sql语句拼接起来
40             }
41         }
42         $sql = rtrim($sql, ‘,‘);
43         $result =  $GLOBALS[‘mysqli‘]->query($sql);
44         echo $sql,‘<br>‘;
45 46 47         $j++;
48         $s--;
49     }
50     return $result;
51 }
52
53 // 先测试简单的数字插入
54 for ($i = 1;$i <= 505;++$i){
55     $arr[$i] = $i;
56 }
57
58 var_dump(batchInsert($arr,100));

测试505条数据,每次插入100条,分6次插入完成。

时间: 2024-10-10 01:06:30

php+mysql实现数据分批插入的相关文章

mysql大数据量插入参考

Mysql 千万数据10秒批量插入只需三步第一步:配置my.ini文件文件中配置bulk_insert_buffer_size=120M 或者更大将insert语句的长度设为最大.Max_allowed_packet=1MNet_buffer_length=8k保存第二步:查看设置的参选有没有生效.Mysql > SHOW VARIABLES;bulk_insert_buffer_size默认是8M,我们要把它调成100M或百兆以上,也不要太大.第三步:完成设置后,批量插入数据时使用多条模式.I

mysql 重复数据防止插入:)

insert into table (id, name, age) values(1, "A", 19) on duplicate key update name=values(name), age=values(age) /* 插入数据:如果有重复的则选择更新; */ insert ignore into `testtable` (`mpass`,`pass`) select mpass,pass from rr_pass_0 limit 0,1000000 replace into

MySQL创建数据库并插入数据

启动MySql 启动服务:sudo service mysql start 登陆:mysql -u root 新建数据库 CREATE DATABASE <数据库名>; 在大多数SQL系统中,并不区分大小写,但是习惯上:保留字大写,变量和数据小写 连接数据库 use <数据库名> 显示:Database changed,表示连接成功 数据表 数据表是数据库的重要组成部分,是数据在数据库中具体存放的位置 新建数据表:CREATE TABLE <表名> (< 列名1&

解决 C++ 操作 MySQL 大量数据插入效率低下问题

往 Mysql 中,插入10000条简单数据,速度非常缓慢,居然要5分钟左右, 但是打开事务的话,一秒不到就搞定了 代码: #include <iostream> #include <winsock2.h> #include <string> #include "mysql.h" #pragma comment(lib, "libmysql.lib"); using namespace std; int main() { MYSQ

MySQL插入数据时插入无效的列

1.错误描述 com.mysql.jdbc.exception:jdbc4.MySQLSyntaxErrorException:Unknown column 'man' in 'field list' 2.错误原因 数据库表中的字段:sno     sname    sage     ssex 插入数据时:          sno     sname    sage     man          本来是想插入ssex这个字段的值为"man",结果将man弄成了ssex字段名 3.

MySQL 大数据量快速插入方法和语句优化

MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够让您有所收获! INSERT语句的速度 插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开表的初始开销,每个并发运行的查询打开. 表的大小以logN (B树)的速度减慢索引的插入. 加快插入的一些方法 如果同时从同一个客户端插入很多行,使用含多个VA

MySQL为数据表的指定字段插入数据

username not null 没有默认值/有默认值   insert不插入username字段 均不报错 2014年07月23日21:05    百科369 MySQL为数据表的指定字段插入数据 为数据表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其它字段的值为数据表定义时的默认值. 基本的语法格式如下: INSERT INTO 表名(字段1,字段2,...,字段m) VALUES(值1,值2,...,值m); 字段1,字段2,...,字段m:表示数据表中的字段名称

Mysql存储过程 一次插入一批数据 或成千条数据 mysql循环语句

Mysql使用存储过程,插入一批数据,可以插入上千条数据,只要使用循环语句,就行了. Mysql(5.0以上版本)在SQLyog(版本是8.32)里如何建立存储过程: 1,          打开SQLyog工具. 2,          建立表procedurehuihui. CREATE TABLE `procedurehuihui` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `code` VARCHAR(50) DEFAULT NULL, `na

MYSQL 大批量数据插入

最近在做MYSQL大批量数据的测试,就简单总结一下遇到的问题: 首先我是简单的写了一个MYSQL的循环插入数据的SP,具体如下: 这是插入100W数据的过程和结果,可以看到是换了55min +20S约3320秒(约300rows/s),看到之后我是只崩溃,就在网上查了些提速的方法: 0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似): 1. 设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at