MYSQL批量插入数据库实现语句性能分析

假定我们的表结构如下

代码如下  

CREATE TABLE example (
example_id INT NOT NULL,
name VARCHAR( 50 ) NOT NULL,
value VARCHAR( 50 ) NOT NULL,
other_value VARCHAR( 50 ) NOT NULL
)

  通常情况下单条插入的sql语句我们会这么写:

代码如下  

INSERT INTO example
(example_id, name, value, other_value)
VALUES
(100, 'Name 1', 'Value 1', 'Other 1');

  mysql允许我们在一条sql语句中批量插入数据,如下sql语句:

代码如下  

INSERT INTO example
(example_id, name, value, other_value)
VALUES
(100, 'Name 1', 'Value 1', 'Other 1'),
(101, 'Name 2', 'Value 2', 'Other 2'),
(102, 'Name 3', 'Value 3', 'Other 3'),
(103, 'Name 4', 'Value 4', 'Other 4');

  如果我们插入列的顺序和表中列的顺序一致的话,还可以省去列名的定义,如下sql

代码如下  

INSERT INTO example
VALUES
(100, 'Name 1', 'Value 1', 'Other 1'),
(101, 'Name 2', 'Value 2', 'Other 2'),
(102, 'Name 3', 'Value 3', 'Other 3'),
(103, 'Name 4', 'Value 4', 'Other 4');

  上面看上去没什么问题,下面我来使用sql语句优化的小技巧,下面会分别进行测试,目标是插入一个空的数据表200W条数据

  第一种方法:使用insert into 插入,代码如下:

代码如下  

$params = array('value'=>'50');
set_time_limit(0);
echo date("H:i:s");
for($i=0;$i<2000000;$i++){
$connect_mysql->insert($params);
};
echo date("H:i:s");

  最后显示为:23:25:05 01:32:05 也就是花了2个小时多!

  第二种方法:使用事务提交,批量插入数据库(每隔10W条提交下)最后显示消耗的时间为:22:56:13 23:04:00 ,一共8分13秒 ,代码如下:

代码如下  

echo date("H:i:s");

$connect_mysql->query('BEGIN');
$params = array('value'=>'50');
for($i=0;$i<2000000;$i++){ 
$connect_mysql->insert($params);
if($i%100000==0){
$connect_mysql->query('COMMIT');
$connect_mysql->query('BEGIN');
}
}
$connect_mysql->query('COMMIT');
echo date("H:i:s");

  第三种方法:使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入,如果字符串太长,

  则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 2*1024*1024*10;消耗时间为:11:24:06 11:25:06;

  插入200W条测试数据仅仅用了1分钟!代码如下:

代码如下  

$sql= "insert into twenty_million (value) values";
for($i=0;$i<2000000;$i++){
$sql.="('50'),";
};
$sql = substr($sql,0,strlen($sql)-1);
$connect_mysql->query($sql);

  最后总结下,在插入大批量数据时,第一种方法无疑是最差劲的,而第二种方法在实际应用中就比较广泛,第三种方法在插入测试数据或者其他低要求时比较合适,速度确实快。

Mysql插入很慢,找到了稍微快点的方法相关推荐

  1. jdbc 3种获得mysql插入数据的自增字段值的方法_JDBC 3种获得mysql插入数据的自增字段值的方法...

    JDBC 3种获得mysql插入数据的自增字段值的方法. 1. Retrieving AUTO_INCREMENT Column Values using Statement.getGenerated ...

  2. jdbc 3种获得mysql插入数据的自增字段值的方法_【JDBC】向数据表插入数据时,自动获取生成的主键...

    数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键: 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid): 当我们没有指定哪一列作为主键key时,数 ...

  3. mysql插入大量数据总结

    1 java实现 package cn.edu.nwsuaf.sheep2.utils;import java.sql.Connection; import java.sql.DriverManage ...

  4. mysql插入数据返回主键值_Mysql千万级别数据批量插入只需简单三步!

    第一步:配置my.ini文件 文件中配置 bulk_insert_buffer_size=120M 或者更大 将insert语句的长度设为最大. Max_allowed_packet=1M Net_b ...

  5. 七种MYSQL插入数据后返回自增主键ID的方法

    我们都知道,mysql中的insert插入之后会有返回值,返回的是影响的行数,也就是说,成功插入一条数据之后返回的是1,失败则返回0.那么,很多时候我们都想要得到最后插入的id值,下面七种方法均可,结 ...

  6. MySQL 插入数据时,中文乱码???问题的解决

    在终端,mysql -u root -p 登录: show variables like 'character%'; 来查看当前数据库的相关编码集. client 为客户端使用的字符集. connec ...

  7. MySQL插入数据很慢优化思路

    MySQL插入数据很慢优化思路 解决方法与思路 解决方法与思路 插入数据量非常大的场景 加大mysql配置中的bulk_insert_buffer_size,这个参数默认为8M bulk_insert ...

  8. mysql 批量数据插入很慢(kettle 输入输出组件) 性能优化办法

    背景 最近在做数仓重构项目,遇到一些性能瓶颈,这里记录一下解决办法. 随着业务数据每天都在增加,几年前开发的etl任务开始跑不动了.大表一般是通过增量的方式插入,但是修复bug 或者每月/季度跑一次的 ...

  9. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

最新文章

  1. SecureCRT如何与Linux虚拟机进行关联
  2. mysql怎么用_面试官都是这样发问的,连环冲锋炮,看你怎么抵挡(上)
  3. openstack(Queens版) 安装FWaaS
  4. python输入10个学生的成绩储存在列表中_获得10名学生的平均成绩python
  5. [09]CSS 边框与背景 (上)
  6. MarkdownPad安装以及绘制 UML 图
  7. c++ 遍历所有点且距离最短_编程小白暑期进阶笔记41-C语言数据结构与算法图遍历的应用...
  8. 别再用Else语句写代码了!
  9. left join缺失右括号_LeetCode刷题实战31:最长有效括号
  10. DEDE内容页调用栏目的SEO标题、描述、关键字的方法
  11. android edittext不可复制_Android中使EditText只读的方法(可恢复编辑状态)
  12. java ide 的优劣_Java程序员的困惑 Java IDE到底怎么选
  13. 如何对西数硬盘固件进行逆向分析(下)
  14. AHP层次分析法具体操作
  15. 决策支持系统是什么?
  16. esp8266网页控制RGB灯颜色
  17. AcGiGeometry::text 自画实体输出文字实例
  18. Android 手机截屏
  19. Unity3D关于蓄力跳跃
  20. RCNN算法思想简单讲解概述————(究极简单的讲述和理解)

热门文章

  1. python将文本中的数据处理成图像(matplotlib)
  2. mysql sqlsugar_.net core +mysqlSugar(最为简单的增删改查)
  3. 重构——解决过长参数列表(long parameter list)
  4. LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)
  5. rtmp协议分析(三次握手)
  6. php的create_function、function_exists判断函数是否存在
  7. php常量变量连接,PHP常量及变量区别原理详解
  8. HTML中的function函数命名,请问HTML function函数怎么定义和调用?
  9. c++指针总结(易混淆)
  10. 分布式是写出来的(二)