Как проделать операцию с минимальным количеством запросов к БД

Sanu0074
На сайте с 31.08.2012
Offline
110
396

Есть две таблицы в базе данных в одной хранится информация о каждом товаре:

1я `prods_wh` (ид и номера складов и др. данные): id, imei, tmp_id, wh_id...

2я `prods` (вся информация о товаре, общее количество товара на каждом складе, цены, х-ки и т.д): id, imei, wh1_count, wh1_cost, wh2_count, wh2_cost ... ...

т.е. В одной базе (`prods_wh`) лежат все товары, одна строка в ней = один товар (1шт) = один уникальный imei, но tmp_id - у всех одинаковый; В другой базе (`prods`) один товар = один tmp_id, но есть поля wh1_count, wh2_count ... которые соответствуют номеру склада на котором находится товар, т.е wh1_count = количеству строк в таблице `prods_wh` где wh_id = 1 и tmp_id=нужный ид.... соответственно wh2_count = колву строк с wh_id = 2.......

Когда делается импорт товаров в базу (например 20000 товаров), сначала из полученного массива формируем два больших запроса с нужными данными к двум таблицам типа:

INSERT INTO table (FIELD,FIELD,FIELD) VALUES (FIELD,FIELD,FIELD),(FIELD,FIELD,FIELD),(FIELD,FIELD,FIELD).....

Теперь как обе таблицы заполнены, нужно проставить количество товаров на складах, т.е. нужно циклом бежать по таблице `prods_wh` выбирать товары с конкретным tmp_id и считать количество по каждому wh_id и делать соответственный UPDATE запрос таблицы `prods`.... Таких вот запросов будет очень много и это нагрузит сервак.

Было бы хорошо если б как то реализовать подсчет конкретного товара при сборке первого запроса, чтоб не делать повторных INSERT'ов как то запоминать что этот товар (с таким tmp_id) уже будет добавлен, и в случае если он еще раз встречается, делать +1 как конкретному wh[wh_id]_count...

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

- INSERT INTO `prods_wh` .........

- SELECT COUNT FROM `prods` WHERE tmp_id = xxxx

Если результат > 0, то:

- $wh1 = SELECT COUNT FROM `prods_wh` WHERE tmp_id = xxxx AND wh_id=1

- $wh2 = SELECT COUNT FROM `prods_wh` WHERE tmp_id = xxxx AND wh_id=2

- UPDATE `prods` WHERE tmp_id = xxxx SET wh1_count = $wh1, wh2_count = $wh2

Если результат = 0, то:

- INSERT INTO `prods` SET wh[$wh_id]_count = 1

Получаем на каждой итерации минимум 3 запроса, максимум 5. Итого при импорте в базу 20000 товаров, в худшем случае нужно сделать 100000 запросов, это убъет сервак.

Посоветуйте как мне правильно разрулить ситуацию.

Заранее благодарен за внимание)

siv1987
На сайте с 02.04.2009
Offline
427
#1
Sanu0074:
сначала из полученного массива формируем два больших запроса с нужными данными к двум таблицам типа:

Только при этом не забывайте что еще есть такая вещь как max_allowed_packet

Sanu0074:
Теперь как обе таблицы заполнены, нужно проставить количество товаров на складах, т.е. нужно циклом бежать по таблице `prods_wh` выбирать товары с конкретным tmp_id и считать количество по каждому wh_id и делать соответственный UPDATE запрос таблицы `prods`.... Таких вот запросов будет очень много и это нагрузит сервак.

Мне пока трудно понять что вам там нужно, но mysql поддерживает апдейт с связанными таблицами JOIN'ы.

Sanu0074:
в худшем случае нужно сделать 100000 запросов, это убъет сервак.

С чего бы это его убьет? Или у вас ограничение на лимитов запросов в час? Делайте циклами

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий