100w条数据插入Mysql 数据库,耗时仅10s
作者:孤独键客
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语句可以提高性能。
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相关推荐
- 教你急速快速批量插入1000万条数据到mysql数据库表面试题
急速快速批量插入1000万条数据到mysql数据库表面试题 教你急速快速批量插入1000万条数据到mysql数据库表&面试题 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好 ...
- python随机数据库_Python实现生成随机数据插入mysql数据库的方法
本文实例讲述了Python实现生成随机数据插入mysql数据库的方法.分享给大家供大家参考,具体如下: 运行结果: 实现代码: import random as r import pymysql fi ...
- mysql 插入秒_教你88秒插入1000万条数据到mysql数据库表,IG牛逼
我用到的数据库为,mysql数据库5.7版本的首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: com ...
- 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来
我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...
- 插入1000万条数据到mysql数据库表
转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...
- 力控数据写入mysQL_绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来...
我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...
- 4分钟插入1000万条数据到mysql数据库表
准备工作 我用到的数据库为,mysql数据库8.0版本的,使用的InnoDB存储引 创建测试表 CREATE TABLE `product` (`id` int NOT NULL AUTO_INCRE ...
- java mysql 快速插入1000w条数据_教你88秒插入1000万条数据到mysql数据库表
我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...
- Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)
本文主要讲述通过MyBatis.JDBC等做大数据量数据插入的案例和结果. 30万条数据插入插入数据库验证 实体类.mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 ...
- mysql 1000万数据读取_插入1000万条数据到mysql数据库表
转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...
最新文章
- 知识图谱要看的书 了解的人 公众的号
- [Python Machine Learning] 学习笔记之scikit-learn机器学习库
- 静态Web开发 JQuery
- JavaScript 读取、写入Txt文档
- 从1维到6维,一文读懂多维数据可视化策略
- TensorFlow 教程 --进阶指南--3.1总览
- 如何配置神经网络中的层数和节点数
- ai驱动数据安全治理_利用AI驱动的自动协调器实时停止有毒信息
- 差分管电路图_最简单的单差分OCL功放电路图(四款单差分OCL功放电路设计原理图详解)...
- U盘等无法弹出的解决办法
- STN( Spatial Transformer Network)
- tenacity -- Python中一个专门用来retry的库
- 【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning
- 【kafka】kafka 消费数据的时候 报错 (Re-) join group
- nim博奕和巴什博奕
- python没有库怎么办_python缺少依赖(ImportError)库怎么办 | C/C++程序员之家
- 姿态角(Euler角):yaw pitch roll
- android控制电路板的开关灯,一文解读LED触摸调光台灯控制电路板的工作原理
- python淘宝抢单_Python使用Selenium实现淘宝抢单的流程分析
- 【史上最坑爹的游戏】001 游戏介绍及开始页面的实现
热门文章
- MinGW GCC 7.3.0 2018年1月25日 出炉啦
- vue路由vue-router的使用
- 控制器不存在CategoryController does not exist
- flash 转 html5 工具_转
- linux 开机文件系统报错.error 无法挂载
- 大连市2011年初中毕业升学考试试测(一)数 学
- Photoshop 入门教程,处理图层「2」了解图层基本知识
- 如何在 Mac 上查找已保存的密码?
- iOS开发之tableView时报错Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]
- 延迟摄影渲染工具LRTimelapse 6 for Mac