欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql中大数据的批量插入方法比较

程序员文章站 2022-07-05 11:50:38
...

Mysql中大量数据的批量插入方法比较

模型类:
public class Student {
    private int age;
    private String name;
    private boolean sex;
}
方法一:循环单条插入
xml中的插入语句:

<insert id= "insert">
	insert into user (name ,age, sex) values (name, age, sex)
</insert>

service类: 

Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;

public void add(List<Student> itemList) {
    itemList.forEach(StudentMapper::insert);
}

当插入大量数据时,效率极低(不建议使用)
方法二:循环插入多条,拼接sql
xml中的插入语句:

<insert id="insertByBatch" parameterType="java.util.List">
   insert into user (age, name, sex)
    <foreach collection="list" item="item" index="index" separator=",">
      (#{item.age}, #{item.name}, #{item.sex}) 
    </foreach>
</insert>
service类: 

public void add(List<Student> itemList) {
    itemList.forEach(StudentMapper::insertBatch);
}

插入大量数据时,效率尚可,当数据量过于庞大,拼接的sql会很长,由于单条sql的语句有大小限制,所以可能插入失败(推荐数据量不是太大使用)
方法三:mybatis ExecutorType.BATCH批处理执行
Service类:

在batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 
但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的

public void add(List<Student> itemList) {

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
    // 新获取一个模式为BATCH,自动提交为false的session
    // 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
    SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
    StudentMapper mapper = session.getMapper(StudentMapper.class);
        for (int i = 0; i < itemList.size(); i++) {
            mapper.insert(itemList.get(i));
            if(i%1000==999){//每1000条提交一次防止内存溢出
                session.commit();
                session.clearCache();
            }
        }
        session.commit();
        session.clearCache();
}
插入大量数据时,效率最高, 通过重复使用预编译后的语句,不断填充数据,批量提交(数据量很大使用)