gpt4 book ai didi

c# - 如何用C#快速插入多个MYSQL表?

转载 作者:行者123 更新时间:2023-11-29 11:10:09 25 4
gpt4 key购买 nike

我正在尝试将一些数据插入到两个 MYSQL 表中。第二个表将第一个表行 ID 存储为外键。我的代码运行良好,但速度非常慢。使它更快的最佳/最快方法是什么?

string ConnectionString = "server=localhost; password = 1234; database = DB ; user = Jack";
MySqlConnection mConnection = new MySqlConnection(ConnectionString);
mConnection.Open();
int index = 1;


for (int i = 0; i < 100000; i++)
{

string insertPerson = "INSERT INTO myentities(Name) VALUES (@first_name);"
+ "INSERT INTO secondtable(Id, Name,myentities) VALUES (@ID, @city, LAST_INSERT_ID());";
MySqlCommand command = new MySqlCommand(insertPerson, mConnection);
command.Parameters.AddWithValue("@first_name", "Jack");
command.Parameters.AddWithValue("@ID", i+1);

command.Parameters.AddWithValue("@city", "Frank");

command.ExecuteNonQuery();
command.Parameters.Clear();
}

我在 StackoverFlow 的一个问题上找到了以下代码,但它仅将数据插入到单个表中,而不是插入到通过外键连接的多个表中。这段代码非常快,但我不确定如何让它与多个表一起工作。

    public static void BulkToMySQL()
{
string ConnectionString = "server=192.168.1xxx";
StringBuilder sCommand = new StringBuilder("INSERT INTO User (FirstName, LastName) VALUES ");
using (MySqlConnection mConnection = new MySqlConnection(ConnectionString))
{
List<string> Rows = new List<string>();
for (int i = 0; i < 100000; i++)
{
Rows.Add(string.Format("('{0}','{1}')", MySqlHelper.EscapeString("test"), MySqlHelper.EscapeString("test")));
}
sCommand.Append(string.Join(",", Rows));
sCommand.Append(";");
mConnection.Open();
using (MySqlCommand myCmd = new MySqlCommand(sCommand.ToString(), mConnection))
{
myCmd.CommandType = CommandType.Text;
myCmd.ExecuteNonQuery();
}
}
}

最佳答案

最快的方法是制定一个策略,不通过 .NET MySQL 连接器循环调用 mysql。特别是对于 i=0 到 99999 。实现此目的的方法是通过CASE A:直接数据库表操作或CASE B:通过CSV db 导入 LOAD DATA INFILE .

对于情况 B:,将数据放入一个或多个临时表通常是明智的做法。可以根据具体情况检查数据准备情况。这意味着您可能正在获取需要清理的外部数据 ( ETL )。其他好处包括不会将不道德的数据提交到不适合消费的生产表中。因此,它为您留下了一个中止选项。

现在来谈谈表演轶事。通过 2016 年底的 MySQL 和 .NET Connector 版本 6.9.9.0,我可以通过这条路线实现高达 40 倍的性能提升。不调用 INSERT 查询可能看起来不自然,但我不会循环。好的,当然,在小循环中,但不是在批量数据摄取中。即使是 500 行也不行。如果您重新设计一些例程,您将体验到显着的用户体验改进。

所以以上是针对真正来自外部来源的数据。对于情况 A: 数据库中已有的普通数据,上述内容不适用。在这些情况下,您会努力编写 SQL 来在服务器端尽可能多地处理数据(阅读:100%)。因此,它不会将数据返回到客户端,因此需要一些带有连接器循环调用的客户端将其返回到服务器。这不一定或根本不强制要求存储过程。您所追求的目标是对现有数据进行操作的客户端调用,而不进行客户端传输然后备份。

关于c# - 如何用C#快速插入多个MYSQL表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com