我读过很多关于这个的问题,但我找不到一个足够快的.我认为有更好的方法向MySQL数据库中插入大量行

我使用以下代码将100k插入我的MySQL数据库:

public static void CSVToMySQL()
{
    string ConnectionString = "server=192.168.1xxx";
    string Command = "INSERT INTO User (FirstName, LastName ) VALUES (@FirstName, @LastName);";
    using (MySqlConnection mConnection = new MySqlConnection(ConnectionString))
    {
        mConnection.Open();

        for(int i =0;i< 100000;i++) //inserting 100k items
        using (MySqlCommand myCmd = new MySqlCommand(Command, mConnection))
        {
            myCmd.CommandType = CommandType.Text;
            myCmd.Parameters.AddWithValue("@FirstName", "test");
            myCmd.Parameters.AddWithValue("@LastName", "test");
            myCmd.ExecuteNonQuery();
        }
    }
}

这需要10万行大约40秒.我怎样才能更快或更高效?

通过DataTable/DataAdapter或同时插入多行可能更快:

INSERT INTO User (Fn, Ln) VALUES (@Fn1, @Ln1), (@Fn2, @Ln2)...

由于安全问题,我无法将数据加载到文件中并将其加载.

推荐答案

这是我的"多重插入"代码.

插入10万行只需3 seconds秒,而不是40秒!!

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();
        }
    }
}

创建的SQL语句如下所示:

INSERT INTO User (FirstName, LastName) VALUES ('test','test'),('test','test'),... ;

Update:谢谢Salman A我添加了MySQLHelper.EscapeString,以避免在使用参数时内部使用的代码注入.

Mysql相关问答推荐

如何在逗号分隔字符串值中使用LEFT函数

错误:数据包顺序错误.GET:0预期:10 node JS MySQL

根据SQL中的平均范围对学生进行排名

Mysql:使用like Select 查询

mysql 代码给我的外键格式不正确

外部磁盘上的MySQL表空间和数据文件

使用mysql查询获取不关注user1的user3

模拟Mysql Cursor类的fetchone()方法,并将其返回值设置为None

使用 SELECT 时应锁定多少行 .. FOR UPDATE LIMIT 1

如何清除mysql 8 innodb中的数据库缓存

使用 Having 表达式连接多个表

显示值为空的所有列名

计算每个用户在第二个表中有多少条记录

如何在 SQL 的计算列中显示小数点后两位?

将相同的固定值插入多行

如何从 MySQL Workbench 中的图表生成 SQL 脚本?

Drupal 的默认密码加密方法是什么?

如何在 MySQL 中删除此索引?

带有 OuterRef 的简单子查询

MySQL获取两个值之间的随机值