你向 Mysql 数据库插入 100w 条数据用了多久?
点击上方“方志朋”,选择“设为星标”
回复”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 条数据用了多久?相关推荐
- mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?
多线程插入(单表) 多线程插入(多表) 预处理SQL 多值插入SQL 事务(N条提交一次) 多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗? ...
- mysql插10万条数据_MySQL数据库插入100w条数据要花多久?
MySQL数据库插入100w条数据要花多久? 1.多线程插入(单表) 2.多线程插入(多表) 3.预处理SQL 4.多值插入SQL 5.事务(N条提交一次) # 多线程插入(单表) 问:为何对同一个表 ...
- MySQL循环插入100w条数据
注:未经过本文作者同意,严禁转载 创建一个数据库 CREATE DATABASE `数据库名称` 删库-删表sql语句-需要删除的时候使用该语句 -- 删除库 DROP DATABASE `数据库名称 ...
- mysql java datetime_Java向mysql数据库插入datetime类型数据实例(精)
在Mysql数据库中日期跟时间有两种: 1.date类型,date类型也就是我们常见的储存yyyy-MM-dd类型的日期,它不能储存时间,也就是只能储存日期, 2.dateitme就是可以储存日期同时 ...
- C#数据库插入多条数据,抛出异常:另一个 SqlParameterCollection 中已包含 SqlParameter
解决办法很简单:添加语句:cmd.Parameters.Clear(); 原理:在SqlCommand使用完后清理SqlParameter. 代码示例: //定义连接数据库的配置字符串,需要填入你的连 ...
- mysql自动添加多条数据_用一条mysql语句插入多条数据
这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...
- 用一条mysql语句插入多条数据
这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...
- c mysql显示多条数据_用一条mysql语句插入多条数据
假如有一个数据表A: id name title addtime 如果需要插入n条数据 : $time= time(); $data = array( array( 'name'=>'name1 ...
- java mysql 快速插入1000w条数据_教你88秒插入1000万条数据到mysql数据库表
我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...
最新文章
- 汇博工业机器人码垛机怎么写_一文带您理解码垛机器人,原来它这么简单!
- JAVA共有几种窗体布局方式_在Java GUI程序开发中常见的三种布局管理器是什么
- Seata 新特性,APM 支持 SkyWalking
- 【Qt】Qt资源应用--菜单图标
- 华为4g无线路由器虚拟服务器设置方法,华为4g2pro路由器虚拟服务器设置
- python实现解释器_Python设计模式之解释器模式
- 【训练过程】1) Create Training File(创建训练文件)
- 关于自动化测试,你真的懂嘛?
- 安卓自定义相机拍照功能全解(不调用系统相机)
- Retinex实验效果图和图片格式转化的失真问题
- Hadoop2.0环境搭建
- 计算机二级java和c哪个难,计算机二级最好考哪个 考试难度怎么样
- windows7 C盘清理(尽量做到最全,手把手教,狗看完都说它会)
- 安装Solidworks 2018出现可执行文件未成功安装的解决方法 PreReqs\VCRedist10\vcredist_x86.exe
- 金融系列-支付清结算之基本概念和入门
- 浏览器主页被hao123、360导航之类的流氓网址劫持解决方法
- 8.随机生成一个矩阵并对其转置
- 企业的护城河与个人的护城河 更新(2019-05-11)
- 马斯克76岁父亲与继女生子,华强北又出一个芯片IPO,原蚂蚁副总投身AI制药,今日更多大新闻在此...
- bootstrap实例《一》星巴克官网
热门文章
- Spark MLlib之使用Breeze操作矩阵向量
- basePath = request.getScheme()+://+request.getServerName()+:+r
- Eclipse下修改工程名
- border-radius
- Android之自定义AlertDialog无法监听控件
- 2007年你必须学习的10项.NET技术
- LeetCode实战:螺旋矩阵 II
- 【ACM】Doubly Linked List(STL list)
- 干货满满的 Python 实战项目,点赞收藏
- 福利直投!这个活动承包你2020全年技术干货