MySQL数据库插入100w条数据要花多久?

后端实验室

241篇原创内容
公众号

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://www.cnblogs.com/aicro/p/3851434.html

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

(0)

相关推荐

  • 一.MySQL入门基础

    一.MySQL入门基础

  • JDBC

    今天对JDBC的内容又进行了一下复习,并学了一些新的知识如数据库连接池,Spring JDBC等. 主要内容 1. JDBC基本概念2. 快速入门3. 对JDBC中各个接口和类详解 4. 数据库连接池 ...

  • 面试题:如何造10w条测试数据,在数据库插入10w条不同数据

    前言 面试题:如果造10w条测试数据,如何在数据库插入10w条数据,数据不重复 最近面试经常会问到sql相关的问题,在数据库中造测试数据是平常工作中经常会用到的场景,一般做压力测试,性能测试也需在数据 ...

  • ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据

    ABP默认的数据库是SQLServer,不过ABP框架底层是EF框架,因此也是很容易支持其他类型的数据库的,本篇随笔介绍在ABP框架使用Mysql数据库,以及基于SQLServer创建MySql数据库 ...

  • (8条消息) MySql数据库常用命令总结(全)

    一.数据库级命令 1. 数据库连接 命令:mysql -h主机地址 -u用户名 -p用户密码 –port=3307 1.找到安装目录bin, 进入该工作目录,键入该命令mysql -u root -p ...

  • 通过挖掘1539万条数据,我们研究了花西子的主要增长策略

    导语:2019年,新国货消费品成了商业世界最瞩目的风潮.仅在彩妆品类上,有两个品牌名气响当当,一个是完美日记,深受资本青睐,目前估值已超过10亿美元.另一个,则是在天猫闯出来的国潮品牌"花西 ...

  • 往期精选 | 通过挖掘1539万条数据,我们研究了花西子的主要增长策略

    导语:2019年,新国货消费品成了商业世界最瞩目的风潮.仅在彩妆品类上,有两个品牌名气响当当,一个是完美日记,深受资本青睐,目前估值已超过10亿美元.另一个,则是在天猫闯出来的国潮品牌"花西 ...

  • 快速在每条数据行上方批量插入标题行

    快速在每条数据行上方批量插入标题行 工作中有时会遇到在每条数据行上方插入标题行的需求有木有? 比如你要打印工资条.你要打印分发成绩条...... 很多童鞋都不知道从何处入手对不对? 其实有个很简单易学 ...

  • mysql 多条数据中,分组获取值最大的数据记录

    摘要: 多条纪录中,几个字段相同,但是其中一个或者多个字段不同,则去该字段最大(这里只有一个不同) 源数据: 目的是移除:在同一天中只能存在一天数据,则取审核日期最大,数据库脚本如下: SELECT ...

  • MySQL数据库:数据的概念

    基本定义 数据:是数据库总存储的基本对象 定义:描述客观事物的符号记录 种类:数字.文字.图形.图像.声音等 数据库:DB 存储数据的集合 数据库管理系统:DBMS 用户和操作系统之间的一层数据管理软 ...

  • Linux下修改MySQL数据库数据文件路径

    使用rpm安装方式安装完MySQL数据库后,数据文件的默认路径为/var/lib/mysql,然而根目录并不适合用于存储数据文件. 原路径:/var/lib/mysql 目标路径:/home/mysq ...