【问题标题】:c# mysql best way to upload a large data table to a mysql db tablec# mysql 将大数据表上传到mysql db表的最佳方法
【发布时间】:2013-09-11 22:16:44
【问题描述】:

我有一个非常大的表,在 c# 数据表中有大约 1,000,000 行数据,我想将其上传到 mysql 数据库表中。最好和最快的方法是什么?

遍历行并一次上传一行看起来是非常糟糕的性能,有时还会引发超时异常。

我知道其中一种解决方案是将其写入文件并使用 mysqlbulkloader 从文件中读取。有没有其他方法可以直接从数据表到数据库?

【问题讨论】:

  • 当然,您可以插入它,我不确定 BulkInsert 是否适用于 MySQL,但您可以查看它。不过,我的建议是您确实将其写入文件并批量导入。我自己最近对此的经验是,从列表到数据库的任何形式的插入(我尝试使用 link2SQL 插入每一行和 BulkInsert)都会非常缓慢。对于超过 200 万条记录,BulkImport 的速度提高了数百倍。
  • 在您尝试下面的答案后,这看起来很像我尝试的第二种方法,如果需要更长的时间超过一分钟或 2 分钟,请尝试添加一个存储过程,直接从 MySQL 调用 bulkimport 以加载您从列表中写出的制表符分隔文件。我想你会感到惊喜的。我的经验是使用 SQL Server,但是我不能 100% 确定它会如何发展。

标签: c# mysql datatable large-data


【解决方案1】:

非通用解决方案以使用StringBuilder 构建SQL 查询的形式存在。我已经为 MSSQL 2008 使用了这样的解决方案,因此它可能对您有用。

string _insertQuery(IEnumerable<Item> datatable) { 
  sb.Append("INSERT INTO table (coltext, colnum, coltextmore) VALUES "); 
  foreach (var i in datatable) { 
    sb.AppendFormat("('{0}', {1}, '{2}'),", 
      new object[] { i.ColText, i.ColNum, i.ColTextMore }); 
  }
  sb.Remove(sb.Length - 1, 1);
  return sb.ToString();  
}

而且您(可能)需要一种方法来翻阅 1,000,000 行:

var lst = new List<Item>(); 

// ...

for (int i = 0; i < datatable.Count; i += 1000) { 
  _insertQuery(lst.RangeOf(i, 1000); 
}

RangeOf() 是一个IList 扩展名,我通过列表写了该页面:

public static IList<T> RangeOf<T>(this IList<T> src, int start, int length) { 
  var result = new List<T>(); 
  for (int i = start; i < start + length; i++) { 
    result.Add(src[i]); 
  }
  return result; 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多