首页 > 数据库 >MYSQL大批量数据插入的性能问题

MYSQL大批量数据插入的性能问题

时间:2023-04-05 16:45:16浏览次数:46  
标签:JDBC rewriteBatchedStatements 大批量 MYSQL Batch 插入 SQL Mybatis

批处理 rewriteBatchedStatements=true

项目原来使用的大批量数据插入方法是Mybatis的foreach拼接SQL的方法。
我发现不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,实际上在插入的时候仍然是一条条记录的插,速度远不如原来Mybatis的foreach拼接SQL的方法。这对于常理来说是非常不科学的。
测试插入一万条数据的发现除了拼接SQL的方式需要用5秒多的时间外,Mybatis Batch和原生JDBC Batch都需要50多秒,怎么想都觉得不可能,写法没有问题一定是数据库或者数据库连接配置上有问题。
要批量执行的话,JDBC连接URL字符串中需要新增一个参数:rewriteBatchedStatements=true

MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL
另外这个选项对INSERT/UPDATE/DELETE都有效

添加rewriteBatchedStatements=true这个参数后的执行速度比较:
同个表插入一万条数据时间近似值:
JDBC BATCH 1.1秒左右 > Mybatis BATCH 2.2秒左右 > 拼接SQL 4.5秒左右

标签:JDBC,rewriteBatchedStatements,大批量,MYSQL,Batch,插入,SQL,Mybatis
From: https://www.cnblogs.com/jimmyhu/p/17289704.html

相关文章

  • 用Yum在Linux安装MySQL8
    前言我们通过Yum几乎全自动的快速安装MySQL服务,这里演示的是8.0版本,给出了具体步骤、脚本、图例,和相关资料来源,以及解决远程连接相关问题。准备工作更换国内yum源提速参考CentOS更换YUM源更换yum源,国内下载速度更快。找MySQL官方yum仓库地址这一步只是告诉大家后面安装脚本......
  • 一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections)
    在上一篇文章中"一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例"提到,项目中新增几个数据库后,数据库最大连接数达到了默认的最大值100。此时,如果再创建连接,就会报错(TooManyConnections)。因此,需要手动设置MySQL的最......
  • 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引
    先大致介绍下项目的数据库信息。数据库A:主要存放的通用的表,如User、Project、Report等。数据库B、C、D:一个项目对应一个数据库,而且这几个项目的表是完全一样的。数据库表的特点A中的表:数据量几乎都比较小,比如User表中用户数,顶多也就几百上千。B中的表:X/Y/Z3张表几乎是确定的,Data表......
  • Ubuntu10.04下配置和使用JDK-Mysql-Tomcat-SVN
    操作系统:Linux-Ubuntu10.0.4,JDK:1.61.安装JDK和设置Java环境变量1.1安装JDKa.下载JDKjdk-6u31-linux-x64.bin,具体下载哪个,根据自己的平台和系统来决定b.修改权限,增加可执行权限sudochmodu+xjdk-6u31-linux-x64.binc.进入到jdk-6u31-linux-x64.bin所在的目录./jdk-6u31-linux-x......
  • Linux安装mysql数据库
    1.下载路径:https://dev.mysql.com/downloads/2.上传解压#tar-xvfMySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar3.安装#rpm-ivhMySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm--nodeps#rpm-ivhMySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm--no......
  • MySQL AutoIncrement--PXC集群批量插入操作获取自增ID异常问题
    问题描述由于MySQLPXC集群的所有节点均可读写,因此当PXC集群中节点增加和减少时,PXC集群会自动调整集群各节点的自增ID步长,避免不同集群节点生成相同自增ID值产生冲突。当PXC集群中读节点数量发生变化时,客户端执行BatchInsert方法可能返回错误的自增ID值。问题原因由于MySQL数......
  • mysql 分组查询
    创建表employeeCREATETABLE`employee`(`id`int(11)NOTNULL,`name`varchar(50)DEFAULTNULL,`gender`varchar(1)DEFAULTNULL,`hire_date`dateDEFAULTNULL,`salary`decimal(10,0)DEFAULTNULL,`performance`double(255,0)DEFAULTNULL,`......
  • MySQL四种日志binlog/redolog/relaylog/undolog
    优质博文:IT-BLOG-CN一、binlogbinlog记录数据库表结构和表数据变更,比如update/delete/insert/truncate/create,它不会记录select。存储着每条变更的SQL语句和XID事务Id等等。binlog日志文件如下:[[email protected]]#mysqlbinlogmysql-binlog.0000012..........#at523#......
  • MySQL如何给已经存在的表添加自增主如何给
    之前做账本的时候是没有主键的,在phpmyadmin上无法直接删除或者编辑数据,通过查阅资料呢,给已经存在的表增加自增主键,做一个记录。我的数据库是MySQL的。其他SQL数据库都差不多。注意一下啊就可。/*首先增加自增字段*/altertabletable_nameaddcolumnidintauto_incrementprima......
  • mysql中on有时有筛选的功能
    leetcode中行程和用户SELECTrequest_atas'Day',round(avg(Status!='completed'),2)as'CancellationRate'FROMtripstJOINusersu1ON(t.client_id=u1.users_idANDu1.banned='No')JOINusersu2ON(t.driver......