关于百万级别数据入库的坑(sql中value和values的区别)

本文讲述了在处理百万级别数据入库时遇到的问题,通过对比使用ibatis框架和原生JDBC,发现使用JDBC批量插入能显著提高效率。然而,在使用JDBC时,发现`value`和`values`在SQL语句中的使用导致了性能的巨大差异,改正后,数据入库时间从十多分钟降低到十多秒。尽管通常认为`value`比`values`快,但作者的实际经验却显示`values`在大数据量插入时表现更优。文章末尾分享了一个博主的资源,供读者参考学习如何快速插入大量数据。
摘要由CSDN通过智能技术生成

        最近公司需要和第三方对接同步数据,数据有几百万条来回的传输,当上百万的数据要更新入库时,我犯了难,由于项目框架过于老旧(新的框架博主没有去了解怎么去大批量入库),使用的ibatis框架在入库上百万的数据时很久(可能是框架需要解析你的sql),时间大概在5-10分钟甚至更久,这很明显不符合我的预期,经过我多方的学习,什么分批插入,sql的批量拼接等等都没有达到我的预期,最后发现大佬们用原生的JDBC去重复的生成sql然后一次性提交,这样百万级别的数据入库也就需要十多秒,如图1

图1       

         紧接着博主立马应用到我的需求里面,经过一顿改改改,终于把使用框架插入换成使用JDBC插入,然后我信心满满的启动项目跑跑跑,然后发现不对劲,怎么比我没改之前还要慢啊十多分钟都跑不完,怎么会这么奇怪呢,立马打断点。循环生成sql这一步很快。在JDBC提交这里很慢,紧接着去看表,是不是表有问题,换表在插入还是慢,各种方向一顿排查还是没有发现问题,最后去看sql,发现插入的value和values不一样,改了再跑,快了!!!从十多分钟都跑不完变成的十多秒跑完,泪目,那么一点小问题半天没有发现(刚开始博主确实不懂MySQL中value和values的区别)。

        我解决完这个问题的时候立马百度了value和values有啥区别,发现挺多博主说value要比values要快,这就很奇怪了,我跑百万数据入库的时候values要比value快超级多,根本不是在一个量级的,百思不得其解,最后如果有小伙伴想要JDBC的代码大家可以去参考这个博主的代码:教你如何6秒钟往MySQL插入100万条数据的实现_Mysql_脚本之家

### 回答1: 当然可以,以下是一个使用Java编写的基本数据入库示例: ```java import java.sql.*; public class DataInsertionExample { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/mydatabase"; static final String USER = "root"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // 注册 JDBC 驱动器 Class.forName(JDBC_DRIVER); // 打开一个连接 System.out.println("连接数据库..."); conn = DriverManager.getConnection(DB_URL, USER, PASS); // 执行查询 System.out.println("实例化Statement对象..."); stmt = conn.createStatement(); String sql; sql = "INSERT INTO Employees (id, first, last, age) VALUES (100, 'John', 'Doe', 30)"; stmt.executeUpdate(sql); // 完成 System.out.println("数据已成功插入!"); // 清理环境 stmt.close(); conn.close(); } catch(SQLException se) { // 处理 JDBC 错误 se.printStackTrace(); } catch(Exception e) { // 处理 Class.forName 错误 e.printStackTrace(); } finally { // 关闭资源 try { if(stmt!=null) stmt.close(); } catch(SQLException se2) { } // 什么也不做 try { if(conn!=null) conn.close(); } catch(SQLException se) { se.printStackTrace(); } } } } ``` 在这个示例,我们使用JDBC驱动程序连接到MySQL数据库,并在示例插入了一条记录到“Employees”表。请注意,您需要更改连接URL、用户名和密码以反映您自己的数据库连接信息,以及更改插入语句以反映您自己的表和字段名称。 ### 回答2: 是的,我会使用Java编写一个关于数据入库的代码。 首先,我会使用Java数据库连接API(如JDBC)来连接到数据库。然后,我将创建一个表来存储数据,包括所需的列和数据类型。接下来,我会编写一个Java类,包含插入数据的方法。 在插入数据的方法,我会使用SQL INSERT语句来将数据插入到数据库表。我会使用Java的预编译语句来执行SQL语句,并将数据以参数的形式传递给SQL语句。这样可以防止SQL注入攻击。 在方法内部,我会使用try-catch语句来处理可能的异常,如数据库连接错误或SQL语句执行错误。如果发生异常,我会记录错误信息并在控制台或日志打印出来。 最后,我会在应用程序调用这个插入数据的方法,将需要入库数据作为参数传递给方法,以实现数据入库的功能。 总的来说,我了解Java编程语言和数据库连接技术,可以使用Java编写关于数据入库的代码。我将会创建表、编写插入数据的方法,并处理可能的异常情况,以确保数据能够正确入库。 ### 回答3: 是的,我可以使用Java编写一个关于数据入库的代码。 首先,我可以使用Java数据库连接API(如JDBC)来连接数据库。然后,我可以使用Java的相关API(如PreparedStatement)来执行插入语句。 在编写代码之前,我需要先定义数据库表的结构,包括表名和列名。接下来,我可以创建一个适当的Java类来表示数据库表的模型。 在编写数据入库的代码之前,我需要获取需要插入的数据。这些数据可以来自于用户的输入,或者由其他程序生成。一旦我获取了数据,我可以使用JavaSQL语句来构造插入语句。 例如,我可以使用如下的代码来插入一条数据: ```java try { // 连接数据库 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test_db", "username", "password"); // 构造插入语句 String sql = "INSERT INTO table_name (column1, column2, column3) VALUES (?, ?, ?)"; // 创建PreparedStatement对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); // 设置插入语句的参数 preparedStatement.setString(1, value1); preparedStatement.setInt(2, value2); preparedStatement.setDouble(3, value3); // 执行插入操作 int rowsAffected = preparedStatement.executeUpdate(); if (rowsAffected > 0) { System.out.println("数据插入成功!"); } } catch (SQLException e) { e.printStackTrace(); } ``` 在这个示例,`getConnection()`用于连接到数据库,并且需要提供数据库的URL、用户名和密码。然后,我使用`prepareStatement()`构建插入语句,并使用`setXXX()`方法设置插入语句的参数。最后,使用`executeUpdate()`方法执行插入操作,并检查返回的受影响行数来确认插入是否成功。 通过编写类似的代码,我可以根据具体的业务需求编写更多的数据入库逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值