Импорт массива данных в таблицу mySQL?

Доброе время суток.


Есть задача отпарсить TXT и обновить данные в таблице используя результат парсинга.

Первая подзадача решается без проблем, а вот вторая задача решается, но решение не совсем корректное на мой взгляд.


TXT:

001-03-0027,4000.50,5<br/>
001-03-0031,8000.50,6<br/>
001-03-0028,12000.50,7<br/>
001-03-0033,16000.50,8<br/>
...<br/>



Таблица:
CREATE TABLE properties(<br/>
 ...<br/>
 id_1c VARCHAR(255) DEFAULT NULL,<br/>
 price FLOAT DEFAULT 0,<br/>
 count INT(11) DEFAULT 0,<br/>
)<br/>



Обрабатывая файл построчно я получаю 3 переменные $array['id_1c'], $array['price'], $array['count']. Которые запихиваю в запрос:

<br/>
'UPDATE properties SET price='.$array['price'].', count='.$array['count'].' WHERE id_1c = '.$array['id_1c'];<br/>



В итоге получаю количество запросов прямо пропорциональное количеству строк в файле, а их там 5000 шт.

Возможно ли как то оптимизировать данный процесс?

С учетом того, что требуется проводить мониторинг успешности обновления данных:

ID 001-03-0027: обновлен успешно<br/>
ID 001-03-0031: не найден в базе<br/>
ID 001-03-002: не найден в базе<br/>
ID 001-03-0033: обновлен успешно<br/>



Спасибо.
  • Вопрос задан
  • 5479 просмотров
Пригласить эксперта
Ответы на вопрос 3
JeanLouis
@JeanLouis
Последовательность действий:

1. Прочитали сначала ID записей из файла. Выяснили SELECT'ом какие ID есть в базе данных, а какие нет. Это для мониторинга.

2. Загрузили файл в таблицу с помощью " LOAD DATA INFILE" и ключа «REPLACE».
Смотрите синтаксис этой комманды здесь: www.mysql.ru/docs/man/LOAD_DATA.html

Вот и все, никаких лишних нагрузок. Это будет работать моментально.

Если данных совсем много будет, то поэкспериментируется с дополнительным командами:

SET autocommit = 0;
SET UNIQUE_CHECKS=0;
SET foreign_key_checks = 0;
SET sql_log_bin = 0;

// ваш запрос здесь

commit;

В моей задаче все они используются для ускорения загрузки большого количества данных.
Ответ написан
taliban
@taliban
php программист
только теория!

сделать мульти инсерт в другую таблицу всех записей одним запросом, а потом сделать нечто такое:
UPDATE table1, table2
SET table1.field1 = table2.field2
    table1.field2 = table2.field2
WHERE table1.id = table2.id

я не знаю наверняка сработает ли такой апдейт, но в эту сторону я бы смотрел.
Ответ написан
pentarh
@pentarh
А чем вас не устраивает 5к запросов? Абсолютно штатное количество.

Это множественные инсерты можно запихнуть в один запрос (не длиннее чем max_allowed_packet), а апдейты прийдется пускать паравозиком )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы