iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >.Net Core导入千万级数据至Mysql的步骤
  • 526
分享到

.Net Core导入千万级数据至Mysql的步骤

MySQL导入数据.NetCore导入数据MySQLMySQL千万级数据 2022-05-25 15:05:43 526人浏览 八月长安
摘要

目录前期准备实现方法:1、单条数据插入2、合并数据插入3、MysqlBulkLoader插入性能测试对比最后前期准备 订单测试表 CREATE TABLE `trade` (   `id` V

目录
  • 前期准备
  • 实现方法:
    • 1、单条数据插入
    • 2、合并数据插入
    • 3、MysqlBulkLoader插入
  • 性能测试对比
    • 最后

      前期准备

      订单测试

      
      CREATE TABLE `trade` (
        `id` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
        `trade_no` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
        UNIQUE INDEX `id` (`id`),
        INDEX `trade_no` (`trade_no`)
      )
      COMMENT='订单'
      COLLATE='utf8_unicode_ci'
      ENGINE=InnoDB;

      测试环境

      操作系统:Window 10 专业版

      CPU:Inter(R) Core(TM) i7-8650U CPU @1.90GHZ 2.11 GHZ

      内存:16G

      mysql版本:5.7.26

      实现方法:

      1、单条数据插入

      这是最普通的方式,通过循环一条一条的导入数据,这个方式的缺点很明显就是每一次都需要连接一次数据库

       实现代码:

      
      //开始时间
      var startTime = DateTime.Now;
      using (var conn = new MysqlConnection(connsql))
      {
          conn.Open();
      ​
          //插入10万数据
          for (var i = 0; i < 100000; i++)
          {
              //插入
              var sql = string.FORMat("insert into trade(id,trade_no) values('{0}','{1}');",
                  Guid.NewGuid().ToString(), "trade_" + (i + 1)
                  );
              var sqlComm = new MySqlCommand();
              sqlComm.Connection = conn;
              sqlComm.CommandText = sql;
              sqlComm.ExecuteNonQuery();
              sqlComm.Dispose();
          }
      ​
          conn.Close();
      }
      ​
      //完成时间
      var endTime = DateTime.Now;
      ​
      //耗时
      var spanTime = endTime - startTime;
      Console.WriteLine("循环插入方式耗时:" + spanTime.Minutes + "分" + spanTime.Seconds + "秒" + spanTime.Milliseconds + "毫秒");

      10万条测试耗时:

      上面的例子,我们是批量导入10万条数据,需要连接10万次数据库。我们把SQL语句改为1000条拼接为1条,这样就能减少数据库连接,实现代码修改如下:

      
      //开始时间
      var startTime = DateTime.Now;
      using (var conn = new MySqlConnection(connsql))
      {
          conn.Open();
      ​
          //插入10万数据
          var sql = new StringBuilder();
          for (var i = 0; i < 100000; i++)
          {
              //插入
              sql.AppendFormat("insert into trade(id,trade_no) values('{0}','{1}');",
                  Guid.NewGuid().ToString(), "trade_" + (i + 1)
                  );
      ​
              //合并插入
              if (i % 1000 == 999)
              {
                  var sqlComm = new MySqlCommand();
                  sqlComm.Connection = conn;
                  sqlComm.CommandText = sql.ToString();
                  sqlComm.ExecuteNonQuery();
                  sqlComm.Dispose();
                  sql.Clear();
              }
          }
      ​
          conn.Close();
      }
      ​
      //完成时间
      var endTime = DateTime.Now;
      ​
      //耗时
      var spanTime = endTime - startTime;
      Console.WriteLine("循环插入方式耗时:" + spanTime.Minutes + "分" + spanTime.Seconds + "秒" + spanTime.Milliseconds + "毫秒");

      10万条测试耗时:

      通过优化后,原本需要10万次连接数据库,只需连接100次。从最终运行效果看,由于数据库是在同一台服务器,不涉及网络传输,性能提升不明显。

      2、合并数据插入

      在MySQL同样也支持,通过合并数据来实现批量数据导入。实现代码:

      
      //开始时间
      var startTime = DateTime.Now;
      using (var conn = new MySqlConnection(connsql))
      {
          conn.Open();
      ​
          //插入10万数据
          var sql = new StringBuilder();
          for (var i = 0; i < 100000; i++)
          {
              if (i % 1000 == 0)
              {
                  sql.Append("insert into trade(id,trade_no) values");
              }
      ​
              //拼接
              sql.AppendFormat("('{0}','{1}'),", Guid.NewGuid().ToString(), "trade_" + (i + 1));
      ​
              //一次性插入1000条
              if (i % 1000 == 999)
              {
                  var sqlComm = new MySqlCommand();
                  sqlComm.Connection = conn;
                  sqlComm.CommandText = sql.ToString().TrimEnd(',');
                  sqlComm.ExecuteNonQuery();
                  sqlComm.Dispose();
                  sql.Clear();
              }
          }
              
      ​
          conn.Close();
      }
      ​
      //完成时间
      var endTime = DateTime.Now;
      ​
      //耗时
      var spanTime = endTime - startTime;
      Console.WriteLine("合并数据插入方式耗时:" + spanTime.Minutes + "分" + spanTime.Seconds + "秒" + spanTime.Milliseconds + "毫秒");

      10万条测试耗时:

      通过这种方式插入操作明显能够提高程序的插入效率。虽然第一种方法通过优化后,同样的可以减少数据库连接次数,但第二种方法:合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。同时也能减少SQL语句解析的次数,减少网络传输的IO。

      3、MySqlBulkLoader插入

      MySQLBulkLoader也称为LOAD DATA INFILE,它的原理是从文件读取数据。所以我们需要将我们的数据集保存到文件,然后再从文件里面读取。

      实现代码:

      
      //开始时间
      var startTime = DateTime.Now;
      using (var conn = new MySqlConnection(connsql))
      {
          conn.Open();
          var table = new DataTable();
          table.Columns.Add("id", typeof(string));
          table.Columns.Add("trade_no", typeof(string));
      ​
          //生成10万数据
          for (var i = 0; i < 100000; i++)
          {
              if (i % 500000 == 0)
              {
                  table.Rows.Clear();
              }
      ​
              //记录
              var row = table.NewRow();
              row[0] = Guid.NewGuid().ToString();
              row[1] = "trade_" + (i + 1);
              table.Rows.Add(row);
      ​
              //50万条一批次插入
              if (i % 500000 != 499999 && i < (100000 - 1))
              {
                  continue;
              }
              Console.WriteLine("开始插入:" + i);
      ​
              //数据转换为csv格式
              var tradeCsv = DataTableToCsv(table);
              var tradeFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "trade.csv";
              File.WriteAllText(tradeFilePath, tradeCsv);
      ​
              #region 保存至数据库
              var bulkCopy = new MySqlBulkLoader(conn)
              {
                  FieldTerminator = ",",
                  FieldQuotationCharacter = '"',
                  EscapeCharacter = '"',
                  LineTerminator = "\r\n",
                  FileName = tradeFilePath,
                  NumberOfLinesToSkip = 0,
                  TableName = "trade"
              };
      ​
              bulkCopy.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList());
              bulkCopy.Load();
              #endregion
          }
      ​
          conn.Close();
      }
      ​
      //完成时间
      var endTime = DateTime.Now;
      ​
      //耗时
      var spanTime = endTime - startTime;
      Console.WriteLine("MySqlBulk方式耗时:" + spanTime.Minutes + "分" + spanTime.Seconds + "秒" + spanTime.Milliseconds + "毫秒");

      10万条测试耗时:

      注意:MySQL数据库配置需开启:允许文件导入。配置如下:

      secure_file_priv= 

      性能测试对比

      针对上面三种方法,分别测试10万、20万、100万、1000万条数据记录,最终性能入如下:

      最后

      通过测试数据看,随着数据量的增大,MySqlBulkLoader的方式表现依旧良好,其他方式性能下降比较明显。MySqlBulkLoader的方式完全可以满足我们的需求。

      以上就是.net core导入千万级数据至Mysql的步骤的详细内容,更多关于导入千万级数据至Mysql的资料请关注自学编程网其它相关文章!

      您可能感兴趣的文档:

      --结束END--

      本文标题: .Net Core导入千万级数据至Mysql的步骤

      本文链接: https://www.lsjlt.com/news/10374.html(转载时请注明来源链接)

      有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

      本篇文章演示代码以及资料文档资料下载

      下载Word文档到电脑,方便收藏和打印~

      下载Word文档
      猜你喜欢
      • .Net Core导入千万级数据至Mysql数据库的实现方法
        目录前期准备订单测试表测试环境实现方法:1、单条数据插入2、合并数据插入3、MySqlBulkLoader插入性能测试对比最后​最近在工作中,涉及到一个数据迁移功能,从一...
        99+
        2024-04-02
      • 使用.Net Core怎么将大量数据导入至Mysql数据库
        这期内容当中小编将会给大家带来有关使用.Net Core怎么将大量数据导入至Mysql数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。订单测试表CREATE TABLE `trad...
        99+
        2023-06-15
      • 怎么在MySql中插入千万级大数据
        今天就跟大家聊聊有关怎么在MySql中插入千万级大数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。第一步,读取文件,开始插入多线程在这里,达到一定...
        99+
        2024-04-02
      • Python读取千万级数据自动写入MySQL数据库
        目录前言场景一:数据不需要频繁的写入mysql场景二:数据是增量的,需要自动化并频繁写入mysql总结前言 Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常...
        99+
        2024-04-02
      • mysql导入excel数据的步骤
        这篇文章主要介绍mysql导入excel数据的步骤,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql导入excel数据的步骤:1、第一步我们得到了一个excel表,里面有很多需...
        99+
        2024-04-02
      • 千万级oracle数据表定时同步到mysql表的方案
        1:业务背景 第三方系统提供了一张oracle视图,该视图有六千多万条数据,后续每月会产生三百万条数据的数据。需要每天将数据定时同步到自己系统的mysql表中。 (注:我们系统与外界系统访问都要经过一个中间系统的跳转才行。流程如下: 我们系...
        99+
        2023-09-16
        oracle mysql 数据库
      • 千万级数据的mysql数据库与优化方法
        本篇内容主要讲解“千万级数据的mysql数据库与优化方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“千万级数据的mysql数据库与优化方法”吧!1.对查询进行...
        99+
        2024-04-02
      • MySQL千万级数据表的优化实战记录
        前言 这里先说明一下,网上很多人说阿里规定500w数据就要分库分表。实际上,这个500w并不是定义死的,而是与MySQL的配置以及机器的硬件有关。MySQL为了提升性能,会将表的索引...
        99+
        2024-04-02
      • 怎么用Python读取千万级数据自动写入MySQL数据库
        这篇文章主要介绍“怎么用Python读取千万级数据自动写入MySQL数据库”,在日常操作中,相信很多人在怎么用Python读取千万级数据自动写入MySQL数据库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎...
        99+
        2023-07-02
      • MySQL导入数据库的步骤是什么
        MySQL导入数据库的步骤如下:1. 使用命令行或者图形界面工具登录到MySQL数据库服务器。2. 创建要导入数据的数据库(如果尚未...
        99+
        2023-10-18
        MySQL 数据库
      • MySQL千万级数据的大表优化解决方案
        目录1.数据库设计和表创建时就要考虑性能设计表时要注意:索引简言之就是使用合适的数据类型,选择合适的索引引擎2.sql的编写需要注意优化3.分区分区的好处是:分区的限制和缺点:分区的类型:4.分表5.分库mysql数据库...
        99+
        2022-11-20
        mysql千万级数据 mysql优化
      • Mysql百万量级数据如何高效导入Redis
        Mysql百万量级数据如何高效导入Redis,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着系统的运行,数据量变得越来越大,...
        99+
        2024-04-02
      • MySQL如何快速的创建千万级测试数据
        备注: 此文章的数据量在100W,如果想要千万级,调大数量即可,但是不要大量使用rand() 或者uuid() 会导致性能下降 背景 在进行查询操作的性能测试或者sql优化时,我们经常需要在线下环境构建...
        99+
        2024-04-02
      • mysqlimport导入数据库的步骤
        这篇文章主要讲解了“mysqlimport导入数据库的步骤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysqlimport导入数据库的步骤”吧!mysqlimportmysqlimpor...
        99+
        2023-06-05
      • MySQL千万级数据查询的优化技巧及思路
        随着数据量的不断增长,MySQL千万级数据查询的优化问题也日益引人注目。在这篇文章中,我们将深入探讨MySQL千万级数据查询优化的方法和技巧,以帮助开发者更好地优化MySQL性能。 一、数据库设计 数据库设计是优化查询性能的关键,以下是一些...
        99+
        2023-09-03
        数据库 mysql java
      • MySQL中怎么按表创建千万级的压测数据
        这期内容当中小编将会给大家带来有关MySQL中怎么按表创建千万级的压测数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 准备测试表CREATE TABLE...
        99+
        2024-04-02
      • mysql单表千万级数据查询的方法是什么
        在处理千万级数据的单表查询时,可以采取以下方法来提高查询效率: 使用合适的索引:在主键字段和经常用于查询的字段上创建索引,可以加...
        99+
        2024-03-02
        mysql
      • MySQL数据库千万级数据查询和存储的示例分析
        这篇文章主要介绍MySQL数据库千万级数据查询和存储的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!百万级数据处理方案数据存储结构设计表字段设计表字段 not null,因为 null 值很难查询优化且占用额...
        99+
        2023-06-15
      • PLSQL导入数据的步骤是什么
        在PL/SQL中导入数据的步骤如下: 创建一个表来存储要导入的数据,确保表的结构与要导入数据的结构匹配。 使用SQLLoad...
        99+
        2024-04-09
        PLSQL
      • mysql千万级数据量根据索引优化查询速度的实现
        (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更...
        99+
        2024-04-02
      软考高级职称资格查询
      编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
      • 官方手机版

      • 微信公众号

      • 商务合作