暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

利用数据库 LOAD DATA 特性实现数据批量写入

一安未来 2025-02-05
13
大家好,我是一安~

引言

在开发应用程序时,经常会遇到需要向数据库批量写入大量数据的场景,如数据初始化、数据迁移或者从外部系统导入数据等。传统的逐条插入方式在数据量较大时,性能会变得非常低下,因为每一次插入操作都需要与数据库建立连接、进行 SQL
 解析和执行等一系列开销较大的操作。

MyBatis-Plus
 作为一款优秀的 MyBatis
 增强工具,为我们提供了多种数据操作方式,同时结合数据库自身的特性,如LOAD DATA
语句,可以极大地提升批量写入数据的效率。

本文将详细介绍如何使用 MyBatis-Plus
 结合LOAD DATA
特性来实现高效的数据批量写入。

数据库 LOAD DATA 特性介绍

LOAD DATA
是 MySQL
 等数据库提供的一种高效的数据导入语句。它允许从一个文本文件中快速地将数据加载到数据库表中。与传统的 INSERT
 语句相比,LOAD DATA
具有以下优势:

  • 速度快:LOAD DATA
    是基于文件系统的操作,直接将文件中的数据批量加载到数据库表中,避免了多次网络传输和 SQL
     解析的开销。在处理大量数据时,速度比逐条 INSERT
     语句快很多倍。
  • 减少事务开销:传统的 INSERT
     操作如果放在一个事务中,随着数据量的增加,事务的持续时间会变长,占用数据库资源。而LOAD DATA
    可以在短时间内完成大量数据的插入,减少了事务的持续时间,降低了锁争用的可能性。

例如,在 MySQL
 中,LOAD DATA
的基本语法如下:

LOAD DATA [LOCAL] INFILE 'file_name'
INTO TABLE table_name
[FIELDS TERMINATED BY 'field_separator' [OPTIONALLY] ENCLOSED BY 'enclosure_character']
[LINES TERMINATED BY 'line_separator']
[IGNORE number LINES]
[(column_list)]

复制

其中,file_name
是包含要导入数据的文本文件路径;table_name
是目标数据库表;FIELDS TERMINATED BY
指定字段之间的分隔符;LINES TERMINATED BY
指定行之间的分隔符;IGNORE number LINES
表示忽略文件开头的指定行数;(column_list
)指定要导入数据对应的表列。

实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <insert id="batchInsertByLoadData">
        LOAD DATA LOCAL INFILE '/path/to/your/data/file.txt'
        INTO TABLE user
        FIELDS TERMINATED BY ','
        LINES TERMINATED BY '\n'
        (id, name, age)
    </insert>
</mapper>

复制

补充

MyBatis-Plus
 的saveBatch
方法是其提供的一种便捷的批量插入方式,内部会根据配置的批量插入大小(默认为 1000
)将数据拆分成多个批次进行插入操作。

性能对比

  • LOAD DATA
    :如前所述,它基于文件系统操作,直接将文件数据批量加载到数据库表,避免了多次网络传输和 SQL
     解析,在处理大量数据(如数十万条甚至更多)时,性能优势极其明显,速度比逐条插入快数倍甚至数十倍。
  • saveBatch
    :虽然它也实现了批量插入,通过将数据分批次发送到数据库减少了连接次数,但每一批次的数据仍需进行 SQL
     解析和执行等操作。在数据量较大时,相比LOAD DATA
    ,性能会有较大差距。例如,当插入 10
     万条数据时,LOAD DATA
    可能只需要几秒钟,而saveBatch
    可能需要几十秒甚至更长时间,具体时间取决于数据库配置、服务器性能等因素。

适用场景

  • LOAD DATA
    :适用于大规模数据的一次性导入,比如数据初始化、从外部系统进行全量数据迁移等场景。由于其对数据格式要求较为严格,且操作相对复杂,不太适合少量数据的频繁插入。
  • saveBatch
    :适用于数据量相对较小(如几千条以内)或者对数据格式和操作灵活性要求较高的场景。例如,在日常业务中,当需要批量插入一些用户操作记录等少量数据时,saveBatch
    使用起来更加方便快捷。

最后

通过 MyBatis-Plus
 结合数据库的LOAD DATA
特性以及使用其自带的saveBatch
方法,都可以实现数据的批量写入,但两者各有优劣。在实际应用中,开发者需要根据具体的业务场景、数据量大小、代码复杂度要求以及事务控制等因素,综合考虑选择合适的方法。如果是处理大规模数据的一次性导入,LOAD DATA
无疑是更好的选择,能显著提升性能;而对于少量数据的频繁插入或者对开发效率要求较高的场景,saveBatch
则更为合适。希望本文能为读者在解决数据批量写入问题时提供全面的参考和帮助,以便根据实际需求做出最优决策。

Mybatis Plus 批量插入性能优化,非常实用!
分布式环境下验证码登录的技术实现
四种不同的分页解决方案
封装一个多级菜单、多级评论、多级部门的统一工具类
高性能、无侵入的 Java 性能监控神器

文章转载自一安未来,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论