作者:孤独键客

https://juejin.im/post/5d255ab9e51d454f73356dcd

目录

  • 多线程插入(单表)

  • 多线程插入(多表)

  • 预处理 SQL

  • 多值插入 SQL

  • 事务( N 条提交一次)

多线程插入(单表)

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

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

  • 链接耗时 (30%)
  • 发送query到服务器 (20%)
  • 解析query (20%)
  • 插入操作 (10% * 词条数目)
  • 插入index (10% * Index的数目)
  • 关闭链接 (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, new Date(System.currentTimeMillis()));pstmt.setDate(4, new Date(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、将表的存储引擎修改为InnoDB
2、将 sql 拼接成字符串,每 1000 条左右提交事务。
/// <summary>/// 执行多条SQL语句,实现数据库事务。/// </summary>mysql数据库/// <param name="SQLStringList">多条SQL语句</param>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!

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

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

正文结束

推荐阅读 ↓↓↓

1.

2.

3.

4.

5.

6.

7.

8.

一个人学习、工作很迷茫?

点击「」加入我们的小圈子!

100w条数据插入Mysql 数据库,耗时仅10s相关推荐

  1. 教你急速快速批量插入1000万条数据到mysql数据库表面试题

    急速快速批量插入1000万条数据到mysql数据库表面试题 教你急速快速批量插入1000万条数据到mysql数据库表&面试题 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好 ...

  2. python随机数据库_Python实现生成随机数据插入mysql数据库的方法

    本文实例讲述了Python实现生成随机数据插入mysql数据库的方法.分享给大家供大家参考,具体如下: 运行结果: 实现代码: import random as r import pymysql fi ...

  3. mysql 插入秒_教你88秒插入1000万条数据到mysql数据库表,IG牛逼

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

  4. 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来

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

  5. 插入1000万条数据到mysql数据库表

    转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...

  6. 力控数据写入mysQL_绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来...

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

  7. 4分钟插入1000万条数据到mysql数据库表

    准备工作 我用到的数据库为,mysql数据库8.0版本的,使用的InnoDB存储引 创建测试表 CREATE TABLE `product` (`id` int NOT NULL AUTO_INCRE ...

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

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

  9. Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)

    本文主要讲述通过MyBatis.JDBC等做大数据量数据插入的案例和结果. 30万条数据插入插入数据库验证 实体类.mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 ...

  10. mysql 1000万数据读取_插入1000万条数据到mysql数据库表

    转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...

最新文章

  1. 知识图谱要看的书 了解的人 公众的号
  2. [Python Machine Learning] 学习笔记之scikit-learn机器学习库
  3. 静态Web开发 JQuery
  4. JavaScript 读取、写入Txt文档
  5. 从1维到6维,一文读懂多维数据可视化策略
  6. TensorFlow 教程 --进阶指南--3.1总览
  7. 如何配置神经网络中的层数和节点数
  8. ai驱动数据安全治理_利用AI驱动的自动协调器实时停止有毒信息
  9. 差分管电路图_最简单的单差分OCL功放电路图(四款单差分OCL功放电路设计原理图详解)...
  10. U盘等无法弹出的解决办法
  11. STN( Spatial Transformer Network)
  12. tenacity -- Python中一个专门用来retry的库
  13. 【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning
  14. 【kafka】kafka 消费数据的时候 报错 (Re-) join group
  15. nim博奕和巴什博奕
  16. python没有库怎么办_python缺少依赖(ImportError)库怎么办 | C/C++程序员之家
  17. 姿态角(Euler角):yaw pitch roll
  18. android控制电路板的开关灯,一文解读LED触摸调光台灯控制电路板的工作原理
  19. python淘宝抢单_Python使用Selenium实现淘宝抢单的流程分析
  20. 【史上最坑爹的游戏】001 游戏介绍及开始页面的实现

热门文章

  1. MinGW GCC 7.3.0 2018年1月25日 出炉啦
  2. vue路由vue-router的使用
  3. 控制器不存在CategoryController does not exist
  4. flash 转 html5 工具_转
  5. linux 开机文件系统报错.error 无法挂载
  6. 大连市2011年初中毕业升学考试试测(一)数 学
  7. Photoshop 入门教程,处理图层「2」了解图层基本知识
  8. 如何在 Mac 上查找已保存的密码?
  9. iOS开发之tableView时报错Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]
  10. 延迟摄影渲染工具LRTimelapse 6 for Mac