大数据CSV导入MySQL

一个高性能的CSV文件导入MySQL数据库的Spring Boot工具,支持自动类型推断、动态建表、流式处理和批量导入。

源码

在这里插入图片描述

https://github.com/ShouZhiDuan/easydo/tree/main/csv-import-mysql

主要特性

  • 🚀 高性能: 使用HikariCP连接池和批量操作,支持大文件快速导入
  • 🧠 智能类型推断: 自动分析CSV数据并推断最适合的MySQL字段类型
  • 📊 动态建表: 根据CSV文件结构自动创建对应的MySQL表
  • 🔄 流式处理: 边读取CSV边插入数据库,内存占用低
  • 📈 批量操作: 支持自定义批次大小的批量插入
  • 🔍 自动索引: 支持指定字段自动创建索引
  • ⚙️ 灵活配置: 支持动态数据库连接配置
  • 🎯 解耦设计: CSV处理和数据库操作完全分离

技术栈

  • Spring Boot 2.7.14
  • Spring JDBC Template
  • HikariCP 连接池
  • Apache Commons CSV
  • MySQL 8.0+
  • Maven

快速开始

1. 环境要求

  • Java 11+
  • Maven 3.6+
  • MySQL 8.0+

2. 构建项目

mvn clean package

3. 使用方式

交互式模式
java -jar target/csv-import-1.0.0.jar --interactive

按提示输入CSV文件路径、数据库连接信息等参数。

命令行模式
java -jar target/csv-import-1.0.0.jar \
  /path/to/data.csv \
  "jdbc:mysql://localhost:3306/testdb" \
  root \
  password \
  "id,user_id,created_date" \
  2000 \
  1000

参数说明:

  • 参数1: CSV文件路径
  • 参数2: MySQL数据库URL
  • 参数3: 数据库用户名
  • 参数4: 数据库密码
  • 参数5: 索引列名(可选,多个用逗号分隔)
  • 参数6: 批次大小(可选,默认1000)
  • 参数7: 样本大小(可选,默认1000)
编程方式使用
@Autowired
private CsvImportService csvImportService;

public void importData() {
    // 配置数据库连接
    DatabaseConfig config = new DatabaseConfig(
        "jdbc:mysql://localhost:3306/testdb",
        "root",
        "password"
    );
    
    // 指定需要创建索引的列
    List<String> indexColumns = Arrays.asList("id", "user_id");
    
    // 执行导入
    csvImportService.importCsv(
        "/path/to/data.csv", 
        config, 
        indexColumns, 
        2000,  // 批次大小
        1000   // 样本大小
    );
    
    // 关闭连接
    csvImportService.closeConnection();
}

核心组件

1. CsvService

负责CSV文件处理:

  • 解析CSV文件头部
  • 数据类型推断
  • 流式数据读取
  • 表名提取

2. DatabaseService

负责数据库操作:

  • 动态创建数据库连接
  • 创建表结构
  • 批量数据插入
  • 创建索引

3. CsvImportService

主要业务逻辑:

  • 整合CSV处理和数据库操作
  • 控制导入流程
  • 错误处理和日志记录

数据类型映射

CSV数据特征推断的Java类型MySQL字段类型
纯整数INTEGERINT
长整数(10位+)LONGBIGINT
小数DOUBLEDOUBLE
true/false/yes/no/1/0BOOLEANBOOLEAN
日期格式DATEDATE
日期时间格式TIMESTAMPTIMESTAMP
其他STRINGVARCHAR/TEXT

性能优化

1. 连接池优化

DatabaseConfig config = new DatabaseConfig(url, username, password);
config.setMaximumPoolSize(50);     // 最大连接数
config.setMinimumIdle(20);         // 最小空闲连接
config.setConnectionTimeout(30000); // 连接超时

2. 批量操作优化

  • 使用rewriteBatchedStatements=true参数
  • 适当增加批次大小(建议1000-10000)
  • 启用预编译语句缓存

3. MySQL配置优化

-- 临时禁用约束检查(导入时)
SET foreign_key_checks = 0;
SET unique_checks = 0;
SET autocommit = 0;

-- 调整缓冲区大小
SET innodb_buffer_pool_size = 1G;
SET bulk_insert_buffer_size = 256M;

配置说明

application.yml配置

csv-import:
  default:
    batch-size: 1000        # 默认批次大小
    sample-size: 1000       # 默认样本大小
    connection-timeout: 30000 # 连接超时时间
    max-pool-size: 20       # 最大连接池大小
    min-idle: 5             # 最小空闲连接数
  
  performance:
    enable-batch-rewrite: true      # 启用批量重写
    enable-prep-stmt-cache: true    # 启用预编译缓存
    prep-stmt-cache-size: 250       # 缓存大小

错误处理

  • 文件不存在: 检查CSV文件路径是否正确
  • 数据库连接失败: 检查数据库URL、用户名、密码
  • 类型转换错误: 工具会自动降级为字符串类型
  • 内存不足: 减少批次大小或增加JVM堆内存

最佳实践

  1. 大文件处理: 使用较大的批次大小(5000-10000)
  2. 类型推断: 增加样本大小提高准确性
  3. 索引策略: 在数据导入完成后创建索引
  4. 连接池: 根据并发需求调整连接池大小
  5. 监控: 关注日志输出,监控导入进度

示例数据

创建测试CSV文件 users.csv

id,name,age,salary,is_active,created_date
1,John Doe,25,50000.50,true,2023-01-01
2,Jane Smith,30,60000.75,false,2023-01-02
3,Bob Johnson,35,70000.00,true,2023-01-03

导入命令:

java -jar csv-import-1.0.0.jar \
  users.csv \
  "jdbc:mysql://localhost:3306/testdb" \
  root \
  password \
  "id,name"

生成的MySQL表结构:

CREATE TABLE `users` (
  `id` INT,
  `name` VARCHAR(255),
  `age` INT,
  `salary` DOUBLE,
  `is_active` BOOLEAN,
  `created_date` DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE INDEX `idx_users_id` ON `users` (`id`);
CREATE INDEX `idx_users_name` ON `users` (`name`);
### 如何在 MySQL Workbench 中导入大型数据集 #### 使用 Data Import 功能 MySQL Workbench 提供了一个图形化的界面用于导入 SQL 文件或其他自包含的数据文件。对于大型数据集,可以通过 `Server` -> `Data Import` 来实现[^4]。 1. **选择导入方式**: 在 `Data Import` 界面中,可以选择从自包含文件 (`Import from Self-Contained File`) 或者重新创建模式并导入转储数据的方式。如果是一个完整的 `.sql` 文件,则推荐使用前者。 2. **设置目标数据库**: 如果需要将数据导入到现有的数据库或者新建一个数据库,在此步骤可以指定目标 Schema 并调整默认选项。点击 `Default Target Schema` 下拉菜单进行配置。 3. **启动导入进程**: 完成上述设置之后按下 `Start Import` 开始传输数据。注意观察右侧的日志窗口以确认整个流程顺利运行直至结束,并留意任何潜在错误提示。 #### 性能考量与优化建议 尽管 MySQL Workbench 是一款强大的管理工具,但在处理超大规模数据时可能存在效率瓶颈[^2]: - **对比其他方法**: - 对于非常庞大的 CSV 文件来说,直接利用 MySQL 命令行中的 `LOAD DATA INFILE` 可显著提升速度,因为它绕过了 GUI 层面的操作开销以及 Python 脚本解析逻辑。 - 示例代码如下所示: ```sql LOAD DATA LOCAL INFILE '/path/to/yourfile.csv' INTO TABLE your_table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; ``` - **调整服务器参数**: 修改某些 my.cnf 配置项也可能帮助改善表现,比如增加 innodb_buffer_pool_size 和 max_allowed_packet 大小等关键数值。 #### 编码问题预防措施 为了避免因字符编码差异引发的问题,在准备待上传的 CSV 文档之前务必统一其内部使用的标准为 UTF-8 。另外需要注意的是即使文档本身已经是正确格式化过的版本,有时特定字段内的特殊字符仍可能导致兼容性障碍——此时可尝试转换涉及非 ASCII 字符串部分至纯文本形式再试一次加载动作[^5]。 ```python import pandas as pd df = pd.read_excel('original_file.xlsx') df.to_csv('converted_utf8.csv', index=False, encoding='utf-8') # Ensure proper conversion during export process. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值