多线程插入(单表)
多线程插入(多表)
预处理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     //从池中获取连接     Connection conn = myBroker.getConnection();     PreparedStatement pstmt = conn.prepareStatement(sql);     for (int k = 0; 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、将表的存储引擎修改为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                         {                            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!

OCP周六班开班倒计时2天!需要了解的同学抓紧时间!

课程详情见阅读原文

QQ:1695867545   

48710363

mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?相关推荐

  1. java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快

    目录 场景介绍 项目配置 Mybatis为什么慢? JdbcTemplate让我眼前一亮 原生JDBC就是快啊! 存储过程怎么样? 越简单越快 前言 一直有一种说法:批量插入大量数据到MySQL数据库 ...

  2. android动态更新数据库数据,Android数据库更新——上万条数据的插入

    在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...

  3. mysql如何快速插入一千万条数据_如何快速安全的插入千万条数据?

    最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...

  4. mysql插10万条数据_MySQL数据库插入100w条数据要花多久?

    MySQL数据库插入100w条数据要花多久? 1.多线程插入(单表) 2.多线程插入(多表) 3.预处理SQL 4.多值插入SQL 5.事务(N条提交一次) # 多线程插入(单表) 问:为何对同一个表 ...

  5. mysql查询语句 groupby后取组内时间最近的一条数据时间

    在mysql中使用group by进行分组后取时间最近的一条数据,我们可以直接使用MAX()函数来实现 SELECTT2.nick_name as nickName,count(T1.shared_u ...

  6. mysql查询数据分组后保留每组前n条数据

    最近做项目遇到一个这样需求的sql语句,根据一系列的条件后,分组查询出来的数据是这样的 可以看到用户id=4 的有三条数据,用户id=1的有两条数据. 我需求是相同的用户id只取最多两条数据,也就如下 ...

  7. phpexcel导出大量数据合并单元格_PHPExcel处理一个单元格内多条数据拆分成多个单元格多条数据...

    日期: 2020年6月17日 分类: PHP Tags: Excel 阅读量: 1,221 一.描述需求 如图,当我们遇到一条数据中,某一项内容有多条数据,为了方便文档查阅,我们需要在那一项数据进行拆 ...

  8. Mysql中循环拼接参数_利用循环向数据库中插入数据,参数重复的问题

    又看了些资料,发现对于说参数存在的问题可以把SqlCommand的创建放到For循环里,可以只连一次数据库,但是效率还是没提高.效率的问题不在于对数据库的开关,而是还是逐条地插入数据.而且数据库连接有 ...

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

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

最新文章

  1. session传递参数_分布式 Session 之 Spring Session 架构与设计
  2. iis5.1配置php5.3.1详解,WinXP IIS 5.1 PHP 5.3 VC9.0 配置详解
  3. nodebb使用mysql_centos7.6安装nodebb v1.14.3(2020年)
  4. javascript中addEventListener与removeEventListener
  5. 软件工程导论 05章总体设计
  6. Flask 模版(四)- 时间 Flask-Moment
  7. 如何升级浏览器_涨姿势|教你用手机一键升级路由器软件(固件)
  8. [Python爬虫案例]西刺免费代理IP
  9. 北斗高精度定位在民航机场的创新应用
  10. VS2010中文版微软官方下载
  11. 【项目实战】Python基于Django框架实现校园网上一站式购物系统
  12. axios的并发请求和 排队请求
  13. 计算机合并单元格怎么操作,excel怎么合并单元格,教您excel合并单元格的方法
  14. iOS App Crash 防护框架之 MKCrashGuard
  15. php如何把word转图片
  16. 在Excel中插入行并复制单元格格式
  17. OpenCV3_C++_Erode()图像的收缩 实例
  18. Python软件编程等级考试二级——20210314
  19. arm汇编标号globl和word解释
  20. AMD的cpu vmware装黑苹果报错:客户机操作系统已禁用 CPU,请关闭或重置虚拟机

热门文章

  1. 将列表转成数组_漫画 | 什么是散列表(哈希表)?
  2. php_rce-攻防世界-web-ThinkPHP版本5的相关漏洞
  3. python文件操作:新建删除文件,获取拼接路径,罗列文件路径
  4. 使用Python内置的smtplib包和email包来实现邮件的构造和发送
  5. 在html中2em是多少px,在css设置单位px、em、rem哪个更好?
  6. 【深度学习的数学】激活函数的作用是什么?
  7. IDLE 放置奇兵 算法 地牢 记录
  8. tensorflow教程 开始——数据集:快速了解 tf.data
  9. python numpy ones.like()(返回形状与类型与给定数组相同的数组)
  10. tensorflow dataset_ops shuffle()方法 (随机重新排列此数据集的元素)