SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.05.2011 00:24:14

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

BIG INSERT,UPDATE in MySQL 1 000000 rows

Задавал такой же вопрос на форуме:

http://www.php.ru/forum/viewtopic.php?t=32009

скажите пожалуйста как Вы делали быструю вставку, обновление,
если это касалось 1 000 000 итераций и более

Данные я посылаю через C API c C-кода, т е данные я беру не из базы, а с бинарного файла....

интересует последовательность действий (подготовка запроса, его выполнение)

может быть, что из бинарного файла придется переносить на вставку 100 тысяч записей, цикл однозначно не катит....

если LOAD DATA INFILE , то вначале придется софрмировать txt файл запихнуть в него пачку записей, а потом отдать на вскормку MYSQL, говорят прирост скорости даст в 20 раз....
сама генерация txt файла что то мне не оч нравится...

есть еще вариант вставлять по 1000 записей через строковый буфер
INSERT .... VALUES (..),(...),(...)
придется тоже в цикле, проводить операции конкатенации строки, а потом отсылать ее серверу....

что насчет PREPARE в MySQL? говорят в SQL хорошо подходит для данной ситуации

может у кого то есть опыт в подобных ситуаций, как Вам удавалось:
INSERT,UPDATE 1 млн строк через код языка программирования (С/С++, PHP)

интересует последовательность действий (подготовка запроса, его выполнение)

Неактивен

 

#2 07.05.2011 12:06:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: BIG INSERT,UPDATE in MySQL 1 000000 rows

В своём приложении, делающем примерно то же самое, я в итоге остановился на load data local infile (load data infile, если файл с данными лежит на сервере), получается весьма шустро. А чем Вам не нравится генерация txt-файла для этого?

Можно и через INSERT .... VALUES (..),(...),(...)
Посмотрите вот этот топик.

Что касается последовательности действий:

1. через load data local infile
1) накопить нужное количество данных (ну или копить данные какое-то время), по ходу сбрасывая их в файл.
2) загрузить в БД через load data local infile (лучше в отдельном потоке/процессе, чтобы не блокировать все приложение)
3) стереть файл

2. через длинный insert.
1) выделить большой символьный буфер  у себя программе
2) по ходу появления данных писать туда новые values()
3) как количество станет больше, чем, допустим, миллион - выполнить запрос.

Отредактированно deadka (07.05.2011 12:07:52)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 07.05.2011 12:56:33

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: BIG INSERT,UPDATE in MySQL 1 000000 rows

" load data local infile (load data infile, если файл с данными лежит на сервере)"

файл с данными лежит не на сервере.

данные с файлов для поиска обрабатываются на отдельных компьютерах клиенскими приложениями.

Т.е приложение должно у себя прочесть файл (бинарный) сделать поиск и отправить результаты удаленно серверу MySQL который стоит на отдельном компьютере.

Неактивен

 

#4 07.05.2011 13:21:32

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: BIG INSERT,UPDATE in MySQL 1 000000 rows

Бинарный файл... Будь текстовый с разделителями - можно было бы попробовать его сразу в load data local infile,  - а так, видимо, надо его прочесть каким-то скриптом/программой, распарсить, и далее уже:

Либо скинуть в текстовый файл с разделителями и через load data local infile отправить в базу.
Либо сформировать длинный запрос - и его в базу. Рекомендовал бы Вам попробовать и так и так - и посмотрить, что быстрее получится smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson