Как максимально быстро вставить 20 миллионов записей в базу данных MySql - PullRequest
6 голосов
/ 12 декабря 2011

У меня есть таблица базы данных, как показано ниже:

create table temperature
(id int unsigned not null auto_increment primary key,
temperature double
);

И в моей программе я получил около 20 миллионов температур для вставки в таблицу. Я работаю в среде .Net, использую Connector / Net для подключения к MySql. Код был как ниже:

List<double> temps = new List<double>();
...
string connStr = "server=localhost;user=name;database=test;port=3306;password=*****;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
    conn.Open();

    //temps.Count is about 20 million
    for (int i = 0; i < temps.Count; i++)
    {
        string sql1 = "INSERT INTO temperature VALUES (null, "+temps[i]+")";
        MySqlCommand cmd1 = new MySqlCommand(sql1, conn);
        cmd1.ExecuteNonQuery();
    }

}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}
conn.Close();

Как я могу вставить так много строк данных как можно быстрее? (Он может вставлять только 2000 записей каждую минуту на моем компьютере.)

Ответы [ 4 ]

6 голосов
/ 12 декабря 2011

Вы можете использовать концепцию bulk insert, которая выполняет много операций вставки одновременно, минимизируя накладные расходы при вызове ExecuteNonQuery несколько раз.

в MySQL это называется LOAD DATA, проверьте здесь подробности:http://dev.mysql.com/doc/refman/5.5/en/load-data.html

в MS SQL Server это называется bulk insert, и оно известно как таковое, поэтому я упомянул его с таким именем.

5 голосов
/ 15 февраля 2013

Существует несколько способов оптимизации массовых вставок. Некоторые из них:

  • LOAD DATA INFILE. Существует API-оболочка для .NET . Это самый быстрый способ, но имеет некоторые ограничения и семантические отличия от простых вставок.

  • Многострочный INSERT оператор:

    INSERT INTO temperature (temperature) VALUES (1.0), (2.0), (3.0), ...

    Вы не должны вставлять 20 000 000 строк одновременно, но можете попробовать 1 000-10 000 для очень большого ускорения. Это простой и очень беспроблемный способ увеличить скорость. Часто возможен коэффициент 10, а иногда и больше.

  • Блокировка стола (LOCK TABLES).

  • Временное отключение индексов.

  • Настройка параметров MySQL.

  • INSERT DELAYED (скорее всего, здесь это не очень полезно).

Документация дает вам более подробную информацию об опциях. Некоторые параметры зависят от типа таблицы ( InnoDB против MyISAM ).

Общее предложение: всегда указывайте столбцы, которые вы вставляете перед VALUES. Это делает код более понятным.

1 голос
/ 12 декабря 2011

Вы должны делать массовые вставки. Способ ADO.NET сделать это с помощью DataAdapter .

Для решения, специфичного для MySQL, используйте MySqlBulkLoader .

0 голосов
/ 12 декабря 2011

Общие правила: -

  1. использовать файл загрузки данных
  2. отключить ключ во время импорта, включить его обратно после импорта всех данных
  3. запустить скрипт на самом сервере базы данных, подключиться с помощью сокета вместо tcp / ip

Большинство советов объяснено в документации.

...