ITPub博客

首页 > 数据库 > 数据库开发技术 > 厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库

厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库

原创 数据库开发技术 作者:后端Q 时间:2024-06-16 00:24:00 0 删除 编辑

在处理大量数据时,如何高效地导入数据成为一个关键问题。传统的Excel导入方式在处理百万级别的数据时,往往会遇到性能瓶颈。幸运的是,EasyExcel库的出现,极大地提升了大数据量导入导出的性能。本文将介绍如何使用C#结合EasyExcel库,在短短12秒内将百万级别的数据快速导入MySQL数据库。

1. EasyExcel简介

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,但由于其高效性能,许多开发者希望在其他语言中也实现类似功能。在C#中,虽然没有官方的EasyExcel库,但我们可以借鉴其设计理念,使用流式读取和写入的方式,以及利用异步编程技术来提升性能。

2. 准备工作

在开始之前,请确保你已经安装了以下工具和库:

  • MySQL数据库,并已经创建了相应的表结构。
  • C# 开发环境,如Visual Studio。
  • MySql.Data NuGet包,用于C#与MySQL数据库的交互。
  • EPPlus或ClosedXML等库,用于读取Excel文件(这些库虽然不是专门的流式处理库,但对于大多数情况性能足够)。

3. C# 示例代码

下面是一个简化的C#示例,展示了如何使用流式读取Excel文件,并将数据异步导入到MySQL数据库中。

using System;
using System.Data;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using OfficeOpenXml; // 需要安装EPPlus库

public class ExcelImporter
{
    private string connectionString = "你的MySQL连接字符串";
    private const int BatchSize = 10000; // 每次批量插入的记录数

    public async Task ImportExcelToMySQLAsync(string excelFilePath)
    {
        using (var package = new ExcelPackage(new FileInfo(excelFilePath)))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 假设数据在第一页
            var totalRowCount = worksheet.Dimension.Rows;
            var startRow = 2; // 假设第一行是标题行,从第二行开始读取数据

            using (var connection = new MySqlConnection(connectionString))
            {
                await connection.OpenAsync();
                using (var transaction = connection.BeginTransaction())
                {
                    for (int row = startRow; row <= totalRowCount; row++)
                    {
                        var sqlCommand = new MySqlCommand();
                        sqlCommand.Connection = connection;
                        sqlCommand.Transaction = transaction;

                        // 构建SQL插入语句,这里以插入两个字段为例
                        var column1 = worksheet.Cells[row, 1].Value.ToString();
                        var column2 = worksheet.Cells[row, 2].Value.ToString();
                        sqlCommand.CommandText = $"INSERT INTO your_table (column1, column2) VALUES ('{column1}', '{column2}')";

                        // 批量插入,减少数据库交互次数以提升性能
                        if ((row - startRow) % BatchSize == 0 || row == totalRowCount)
                        {
                            await sqlCommand.ExecuteNonQueryAsync();
                            // 可以选择性地提交事务,并开启新的事务,以便分批次处理错误和回滚
                            transaction.Commit();
                            transaction = connection.BeginTransaction();
                        }
                        else
                        {
                            sqlCommand.CommandText += ";"; // MySQL支持一次执行多条语句,用分号隔开
                        }
                    }
                    transaction.Commit(); // 提交最后一批事务
                }
            }
        }
    }
}

注意:上述代码是一个简化的示例,用于说明基本的流程和思路。在生产环境中,你需要考虑更多的错误处理、数据验证和安全性问题(比如SQL注入)。此外,为了最大化性能,可能还需要对MySQL数据库进行调优。

4. 性能优化建议

  1. 调整BatchSize:根据实际情况调整BatchSize的大小,以找到性能和数据库负载之间的平衡点。
  2. 使用预编译SQL:通过预编译SQL语句(即使用参数化查询)来减少SQL解析时间,并提高安全性。
  3. 数据库调优:确保MySQL数据库已经进行了适当的调优,包括索引优化、内存配置等。
  4. 并行处理:如果硬件资源允许,可以尝试将数据分成多个部分,并行导入以提高速度。
  5. 关闭索引和约束:在导入过程中临时关闭数据库的索引和外键约束,导入完成后再重新构建,可以显著提高导入速度。

5. 结论

通过合理地利用流式读取Excel文件和异步编程技术,结合数据库调优,我们完全有可能在12秒内将百万级别的数据快速导入MySQL数据库。这不仅可以提升数据处理效率,还能为业务带来更快的响应时间和更好的用户体验。


原文作者:后端Q;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    728953