面试的时候老是会有这种问题,
面试官:你做过批量插入吗?
求职者:做过(心里想没做过那不是不想找过工作了)
面试官:如何往表中批量插入数据呢
求职者:mybatis saveBatch
面试官:有没有试过批量插入100W条数据
求职者:。。。
不废话,直接发建表语句和代码
CREATE TABLE `snowflake` ( `id` bigint(20) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
public void insert() { Connection conn = null; PreparedStatement ps = null; try { long start = System.currentTimeMillis(); // 建立连接 conn = SqlUtils.getConnection(); //设置事务为非自动提交 conn.setAutoCommit(false); String sql = "insert into snowflake(id,name)values(?,?)"; ps = conn.prepareStatement(sql); Snowflake snowflake = new Snowflake(0L, 0L); for (int i = 1; i <= 10000000; i++) { ps.setObject(1, snowflake.nextId()); ps.setObject(2, "name_" + snowflake.nextId()); // 添加执行sql ps.addBatch(); if (i % 1000 == 0) { //执行batch ps.executeBatch(); //清空batch ps.clearBatch(); } } //提交数据 conn.commit(); long end = System.currentTimeMillis(); System.out.println("花费的时间为:" + (end - start) / 1000 + "秒"); } catch (Exception e) { e.printStackTrace(); } finally { // 释放资源 SqlUtils.closeResource(conn, ps); } }
prepareStatement已经对SQL语句进行预编译,所以速度很快。
最主要的是设置事务为非自动提交,加速插入速度
1000W条数据我本机测试插入时间为
花费的时间为:100秒
![69aab817a3b09571f4ef35ee31b245fc.png](https://i-blog.csdnimg.cn/blog_migrate/f9a1de111bead4e268c1e2499b5ec989.jpeg)
不知道还有的优化的空间没