当前位置: 首页 > news >正文

Mysql 插入大批量数据调优方法

Mysql 插入大批量数据调优方法

[toc]

1、多线程插入(单表)

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

链接耗时 (30%)

发送query到服务器 (20%)

解析query (20%)

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

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

关闭链接 (10%)

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

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

2、多线程插入(多表)

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

3、预处理 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); //连接归池
}

3、多值插入SQL

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

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

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

4、事务(N条提交一次)

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

1、将表的存储引擎修改为myisam

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);}}}
}
http://www.lryc.cn/news/26670.html

相关文章:

  • matlab基础
  • 自动化测试——多窗口切换和切换frame
  • C#中,Elasticsearch.Net判断空字符串
  • 23种设计模式-适配器模式
  • 深入理解this指向问题
  • 事业单位联考(综合应用A类)典型例题教案
  • frp内网穿透实验
  • 认识JavaScript中的防抖函数
  • macOS 13.3 Beta 2 (22E5230e)With OpenCore 0.8.9正式版 and winPE双引导分区原版镜像
  • JetPack—DataStore核心原理与使用
  • 热烈祝贺|酒事有鲤盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会
  • 深度强化学习DLR
  • Android Handler机制(四) Message源码分析
  • 【Git】git命令(全)
  • 软考论文-成本管理(1)
  • Java 多线程 --- 锁的概念和类型划分
  • python程序员狂飙上头——京海市大嫂单推人做个日历不过分吧?
  • 浅谈子网掩码、IP地址、网络地址之间关系
  • 前端优化的解决方案
  • PYthon组合数据类型的简单使用
  • 【Java】P2 基础语法与运算符
  • 【并发基础】Java中线程的创建和运行以及相关源码分析
  • Spark Shuffle
  • Linux/MacOS 生成双击可执行文件
  • Ubuntu三种拨号方法
  • Vue-router的引入和安装
  • 无线WiFi安全渗透与攻防(四)之kismet的使用
  • 2023新版PMP考试有哪些变化?
  • P8074 [COCI2009-2010#7] SVEMIR 最小生成树
  • 10种常见网站安全攻击手段及防御方法