crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Быстрая вставка миллиона строк в MySQL, prepare,exec
VladimirPivovar
  опции профиля:
сообщение 18.9.2011, 11:46
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 18.9.2011
Пользователь №: 2883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Решил написать алгоритм, который бы быстро вставлял в базу несколько сотен миллионов строк в MySQL

Пока остановился на том, чтобы проверить как вставляется несколько одинаковых строк в цикле:

  qDebug()<<QTime::currentTime();

if (query.prepare("INSERT INTO mainpackage (phoneNumberA,phoneNumberB,phoneNumberC,phoneNumberD,phoneNumberE)"
   "VALUES (?,?,?,?,?)"))
    {
        for (int i=0; i<1000000; i++)
        {
        query.addBindValue(QString("1234567891011"));
        query.addBindValue(QString("1234567891012"));
        query.addBindValue(QString("1234567891013"));
        query.addBindValue(QString("1234567891014"));
        query.addBindValue(QString("1234567891015"));

        }

      qDebug() << query.exec() << "blablabla";
      qDebug() << query.lastError().databaseText();
      qDebug()<<QTime::currentTime();
}





Вместо (?,?,?,?,?) должны ведь подставляться строки 1234567891011 и т. д.

однако при выполнении вываливается ошибка : "No data supplied for parameters in prepared statement"

как побороть данную проблему?

Сообщение отредактировал ViGOur - 6.10.2011, 14:40
Причина редактирования: не забываем про тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 18.9.2011, 17:14
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


query.exec() надо вызывать внутри цикла, а не после.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vadim303
  опции профиля:
сообщение 6.10.2011, 11:51
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 18.1.2010
Пользователь №: 1382

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(ilyabvt @ 18.9.2011, 18:14) *
query.exec() надо вызывать внутри цикла, а не после.

в этом случае будут выполнены миллионы запросов, что не есть гуд. Я бы присмотрелся к методу QSqlQuery::execBatch(). В хелпе и пример доходчивый к нему есть. Возможно за один его вызов все сотни миллионов строк запихивать не хорошо получится, но партиями точно будет быстрее чем одиночными exec(). Ну а размер партий экспериментально определить...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 14.12.2011, 12:12
Сообщение #4





Гости








    


Делаю обычно так:

текстЗапроса = "begin";
текстПодзапрос = " Insert ... value(%1, %2, %3) ...;";

for (...)
{
    текстЗапроса += текстПодзапрос.
        arg(X).
        arg(Y).
        arg(X);
}

текстЗапроса += "end;";

выполняем запрос;



не знаю инъекцией это называется вроде? а может путаю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Svet
  опции профиля:
сообщение 10.1.2012, 12:03
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 26.10.2011
Пользователь №: 2966

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Гость @ 14.12.2011, 12:12) *
Делаю обычно так:

текстЗапроса = "begin";
текстПодзапрос = " Insert ... value(%1, %2, %3) ...;";

for (...)
{
    текстЗапроса += текстПодзапрос.
        arg(X).
        arg(Y).
        arg(X);
}

текстЗапроса += "end;";

выполняем запрос;



не знаю инъекцией это называется вроде? а может путаю


Это явно не инъекция. Думаю, так будет работать гораздо быстрее, чем вызывать каждый раз по одному запросу, но не уверен, что это будет самый быстрый способ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 18:19