Быстрая загрузка данных в MySql

240
01 октября 2017, 23:03

Имеется DataTable с данными.

Как можно быстро залить большой объем данных в MySql?

На офф сайте нашел совет, что для увеличения скорости загрузки делаем

INSERT INTO ... VALUES (),()

Это единственный способ?

Answer 1

Достаточно шустрая штука получилась. Очень быстро идет вставка, если генерить VALUES (),()...

 public void Append(DataTable dt, string dataBaseName, DbSchema dbSchema)
    {
        PreCheckDestinationDb(dt, dataBaseName, dbSchema);
        var cmd = GetBulkInsertQuery(dt);
        var sb = new StringBuilder();
        int counter = 0;
        int total = 0;
        for (var index = 0; index < dt.Rows.Count; index++)
        {
            DataRow row = dt.Rows[index];
            AppendInsertValues(row, sb);
            counter++;
            if (counter >= _insertBatchSize || index + 1 == dt.Rows.Count)
            {
                _conn.Execute(cmd + sb);
                sb.Clear();
                total += counter;
                log.Debug($"Вставлено: {total}/{dt.Rows.Count}");
                counter = 0;
            }
        }
    }
public void AppendInsertValues(DataRow row, StringBuilder sb)
    {
        if (sb.Length != 0)
        {
            sb.Append(",");
        }
        sb.Append("(");
        for (var index = 0; index < row.Table.Columns.Count; index++)
        {
            DataColumn column = row.Table.Columns[index];
            sb.Append(DBNull.Value.Equals(row[column]) ? "NULL" : $"'{MySqlHelper.EscapeString(row[column].ToString())}'");
            if (index + 1 != row.Table.Columns.Count)
            {
                sb.Append(",");
            }
        }
        sb.Append(")");
    }
  string GetBulkInsertQuery(DataTable dt)
    {
        var fieldList = dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToList();
        var cmd = $"INSERT INTO `{dt.TableName}` (";
        foreach (var field in fieldList)
        {
            cmd += $"`{field}`,";
        }
        cmd = cmd.Remove(cmd.Length - 1) + ") VALUES";
        return cmd;
    }
READ ALSO
Зачем нужна запись вида posx_desk + 2 - 1

Зачем нужна запись вида posx_desk + 2 - 1

Исследуя код одного сайта, наткнулся на строчку:

254
Electron не поддерживает defer в теге &lt;script&gt;?

Electron не поддерживает defer в теге <script>?

Собственно, вопрос в заголовкеОкно не отрисовывается до тех пор, пока скрипт не будет выполнен

201
Перебор файлов в каталоге JavaScript

Перебор файлов в каталоге JavaScript

Имеется папка с картинками, пути к ним вручную вносятся в массив и затем используютсяЕсть ли вариант заполнить массив изображениями средствами...

324