点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试资料

目录

1、多线程插入(单表)
2、多线程插入(多表)
3、预处理SQL
4、多值插入SQL
5、事务(N条提交一次)

多线程插入(单表)

问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗?

答:在数据里做插入操作的时候,整体时间的分配是这样的:

1、多链接耗时 (30%)

2、多发送query到服务器 (20%)

3、多解析query (20%)

4、多插入操作 (10% * 词条数目)

5、多插入index (10% * Index的数目)

6、多关闭链接 (10%)

从这里可以看出来,真正耗时的不是操作,而是链接,解析的过程。

MySQL插入数据在写阶段是独占的,但是插入一条数据仍然需要解析、计算、最后才进行写处理,比如要给每一条记录分配自增id,校验主键唯一键属性,或者其他一些逻辑处理,都是需要计算的,所以说多线程能够提高效率。

多线程插入(多表)

分区分表后使用多线程插入。

预处理SQL

普通SQL:即使用Statement接口执行SQL

预处理SQL:即使用PreparedStatement接口执行SQL

使用PreparedStatement接口允许数据库预编译SQL语句,以后只需传入参数,避免了数据库每次都编译SQL语句,因此性能更好。

String sql = "insert into testdb.tuser (name, remark, createtime, updatetime) values (?, ?, ?, ?)";
for(int i = 0; i < m; i++) {
//从池中获取连接
Connection conn = myBroker.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
for(int k = 0; k < n; k++) {pstmt.setString(1, RandomToolkit.generateString(12));pstmt.setString(2, RandomToolkit.generateString(24));pstmt.setDate(3, newDate(System.currentTimeMillis()));pstmt.setDate(4, newDate(System.currentTimeMillis()));
//加入批处理pstmt.addBatch();
}pstmt.executeBatch(); //执行批处理pstmt.close();myBroker.freeConnection(conn); //连接归池
}

多值插入SQL

普通插入SQL:INSERT INTO TBL_TEST (id) VALUES(1)

多值插入SQL:INSERT INTO TBL_TEST (id) VALUES (1), (2), (3)

使用多值插入SQL,SQL语句的总长度减少,即减少了网络IO,同时也降低了连接次数,数据库一次SQL解析,能够插入多条数据。

事务(N条提交一次)

在一个事务中提交大量INSERT语句可以提高性能。

1、将表的存储引擎修改为myisam 2、将 sql 拼接成字符串,每 1000 条左右提交事务。

  • 执行多条SQL语句,实现数据库事务。

  • mysql数据库

  • 多条SQL语句

public void ExecuteSqlTran(List<string> SQLStringList)
{using (MySqlConnection conn = new MySqlConnection(connectionString)){if (DBVariable.flag){conn.Open();MySqlCommand cmd = new MySqlCommand();cmd.Connection = conn;MySqlTransaction tx = conn.BeginTransaction();cmd.Transaction = tx;try{for (int n = 0; n < SQLStringList.Count; n++){string strsql = SQLStringList[n].ToString();if (strsql.Trim().Length > 1){cmd.CommandText = strsql;cmd.ExecuteNonQuery();}//后来加上的  if (n > 0 && (n % 1000 == 0 || n == SQLStringList.Count - 1)){tx.Commit();tx = conn.BeginTransaction();}}//tx.Commit();//原来一次性提交  }catch (System.Data.SqlClient.SqlException E){tx.Rollback();throw new Exception(E.Message);}}}
}

10w条数据大概用时10s!

原文:https://blog.csdn.net/qq_36691683/article/details/89297261

参考资料:

https://www.cnblogs.com/aicro/p/3851434.html

http://blog.jobbole.com/29432/

热门内容:

  • 互联网公司的中年人都去哪了?

  • Github 标星 11.5K!这可能是最好的 Java 博客系统

  • 大批 IDEA 激活码到期之后的乱象...

  • 全面了解 Nginx 主要应用场景

  • 为什么微服务一定要有网关?

  • 那些在一个公司死磕了5-10年的人,最后都怎么样了?

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

你向 Mysql 数据库插入 100w 条数据用了多久?相关推荐

  1. mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?

    多线程插入(单表) 多线程插入(多表) 预处理SQL 多值插入SQL 事务(N条提交一次) 多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗? ...

  2. mysql插10万条数据_MySQL数据库插入100w条数据要花多久?

    MySQL数据库插入100w条数据要花多久? 1.多线程插入(单表) 2.多线程插入(多表) 3.预处理SQL 4.多值插入SQL 5.事务(N条提交一次) # 多线程插入(单表) 问:为何对同一个表 ...

  3. MySQL循环插入100w条数据

    注:未经过本文作者同意,严禁转载 创建一个数据库 CREATE DATABASE `数据库名称` 删库-删表sql语句-需要删除的时候使用该语句 -- 删除库 DROP DATABASE `数据库名称 ...

  4. mysql java datetime_Java向mysql数据库插入datetime类型数据实例(精)

    在Mysql数据库中日期跟时间有两种: 1.date类型,date类型也就是我们常见的储存yyyy-MM-dd类型的日期,它不能储存时间,也就是只能储存日期, 2.dateitme就是可以储存日期同时 ...

  5. C#数据库插入多条数据,抛出异常:另一个 SqlParameterCollection 中已包含 SqlParameter

    解决办法很简单:添加语句:cmd.Parameters.Clear(); 原理:在SqlCommand使用完后清理SqlParameter. 代码示例: //定义连接数据库的配置字符串,需要填入你的连 ...

  6. mysql自动添加多条数据_用一条mysql语句插入多条数据

    这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...

  7. 用一条mysql语句插入多条数据

    这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...

  8. c mysql显示多条数据_用一条mysql语句插入多条数据

    假如有一个数据表A: id name title addtime 如果需要插入n条数据 : $time= time(); $data = array( array( 'name'=>'name1 ...

  9. java mysql 快速插入1000w条数据_教你88秒插入1000万条数据到mysql数据库表

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

最新文章

  1. 汇博工业机器人码垛机怎么写_一文带您理解码垛机器人,原来它这么简单!
  2. JAVA共有几种窗体布局方式_在Java GUI程序开发中常见的三种布局管理器是什么
  3. Seata 新特性,APM 支持 SkyWalking
  4. 【Qt】Qt资源应用--菜单图标
  5. 华为4g无线路由器虚拟服务器设置方法,华为4g2pro路由器虚拟服务器设置
  6. python实现解释器_Python设计模式之解释器模式
  7. 【训练过程】1) Create Training File(创建训练文件)
  8. 关于自动化测试,你真的懂嘛?
  9. 安卓自定义相机拍照功能全解(不调用系统相机)
  10. Retinex实验效果图和图片格式转化的失真问题
  11. Hadoop2.0环境搭建
  12. 计算机二级java和c哪个难,计算机二级最好考哪个 考试难度怎么样
  13. windows7 C盘清理(尽量做到最全,手把手教,狗看完都说它会)
  14. 安装Solidworks 2018出现可执行文件未成功安装的解决方法 PreReqs\VCRedist10\vcredist_x86.exe
  15. 金融系列-支付清结算之基本概念和入门
  16. 浏览器主页被hao123、360导航之类的流氓网址劫持解决方法
  17. 8.随机生成一个矩阵并对其转置
  18. 企业的护城河与个人的护城河 更新(2019-05-11)
  19. 马斯克76岁父亲与继女生子,华强北又出一个芯片IPO,原蚂蚁副总投身AI制药,今日更多大新闻在此...
  20. bootstrap实例《一》星巴克官网

热门文章

  1. Spark MLlib之使用Breeze操作矩阵向量
  2. basePath = request.getScheme()+://+request.getServerName()+:+r
  3. Eclipse下修改工程名
  4. border-radius
  5. Android之自定义AlertDialog无法监听控件
  6. 2007年你必须学习的10项.NET技术
  7. LeetCode实战:螺旋矩阵 II
  8. 【ACM】Doubly Linked List(STL list)
  9. 干货满满的 Python 实战项目,点赞收藏
  10. 福利直投!这个活动承包你2020全年技术干货