Надо сделать 103тыс запросов к базе

123 4
P
На сайте с 06.01.2009
Offline
592
3045

Добрый вечер.

Гуру, подскажите, пожалуйста.

Скрипт проверяет выборку товаров и пишет некоторые нужные данные в базу. Делает 103 тыс запросов Select ....Where к базе

Запускать необходимо будет раз в неделю.

Как можно разгрузить это дело? Может быть паузой или какие то ещё варианты?

Уже 12 работает, никак не закончит...

Спасибо заранее.

зы 22тыс запросов отрабатывал скрипт за 60сек. Сейчас в итоге в 5 раз больше, но время непропорционально увеличилось ((

Russ1an
На сайте с 25.03.2015
Offline
60
#1

Можно на порции разбивать запросы

Достойный дом для любимых проектов https://clck.ru/PT7Vo
Апокалипсис
На сайте с 02.11.2008
Offline
391
#2

Запускайте ночью по крону.

Записки нищего (http://zapiskinishego.ru) - мой личный блог Услуги php программиста. Очень нужна любая работа. Не покупают? Поведенческий аудит интернет-магазина за 5000 руб. (/ru/forum/990312)
Psionik
На сайте с 16.04.2013
Offline
44
#3

Нужно посмотреть на сколько сам по себе сложный запрос, и возможно упростить его до нескольких очередных запросов. Сделать explain.

[PHP, MYSQL, JS, BASH, APACHE, HTML, CSS, Yii, MODX, 500 rur hour]
_
На сайте с 24.03.2008
Offline
381
#4

Если надо регулярно делать сотню тысяч запросов к базе, то в консерватории что-то "КРУПНО НЕТАК"

Переписать так, чтобы запросов к базе надо было сделать три-пять... она (база) в общем-то только для этого и нужна...

Либо делить на части и запускать частями.

То, что при увеличении числа запросов становится "еще медленнее" как-бы намекает на то, что где-то что-то сделано ОЧЕНЬ ПЛОХО. (память там не освобождается, или еще какие ресурсы).

P
На сайте с 06.01.2009
Offline
592
#5

Psionik, _SP_

У нас 2000 товаров. У каждого 6 характеристик - цвет, размер, тип и т.д.

Брали все характеристики, уникализировали, перемешивали (составляя все возможные комбинации) и делали запросы к БД (в итоге их получалось 100тыс), чтобы сохранить id товаров соответствующие каждому запросу.

Минимизировали кол-во запросов до 8тыс. Перемешивали характеристики не всех товаров, а каждого (из 2000 поочереди). Потому что там где получалось 100тыс - в итоге по 92тыс не было ни одного товара подходящего под условия.

А теперь для каждого товара перемешали варианты запросов по характеристикам и получили составили запросы типа

where zvet='blu'

where zvet='blu' AND razmer='15*15'

where zvet='blu' AND strana='Италия'

и т.д.

где 100% есть хоть один товар отвечающий запросу. Где то само собой больше, при частичном совпадении характеристик у других товаров.

Как то так, вообщем. Условно составили ответы для запроса в фильтре заранее, записав их в бд.

NothingMatters
На сайте с 12.06.2017
Offline
45
#6
postavkin:
Psionik, _SP_
Как то так, вообщем. Условно составили ответы для запроса в фильтре заранее, записав их в бд.

Что-то очень и очень странное. Зачем кешировать запросы фильтра?

На 2к записей выборка должна быть чуть быстрее чем скорость света.

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

P
На сайте с 06.01.2009
Offline
592
#7

NothingMatters, не кешировать. Записываем в бд id товаров соответствующих тому или иному варианту фильтрации товара.

Когда юзер фильтранул, просто берем список id из БД соответствующих его запросу.

Есть основания так сделать заранее (запись в бд). Пока что не хотел бы их (основания) разглашать. В тестировании.

Понимаю, что "на лету" это все просто формируется...

NothingMatters
На сайте с 12.06.2017
Offline
45
#8
postavkin:
NothingMatters, не кешировать. Записываем в бд id товаров соответствующих тому или иному варианту фильтрации товара.
Когда юзер фильтранул, просто берем список id из БД соответствующих его запросу.

Есть основания так сделать заранее (запись в бд). Пока что не хотел бы их (основания) разглашать. В тестировании.
Понимаю, что "на лету" это все просто формируется...

Ну это кеширование ответа.

Можно тупо сделать выборку всех товаров, фильтрануть их на стороне скрипта, и в БД уже записать результат батчем.

Не вижу смысла делать сотни тысяч запросов тут.

unixadm
На сайте с 24.09.2010
Offline
110
#9

Вариантов, как обычно, есть несколько и их можно сочетать.

1. Оптимизация запросов.

В консоли mysql напишите:

set profiling=1;

select .... <сам запрос>

show profile;

Так сможете посмотреть, какие этапы запроса отрабатывают медленно и их оптимизировать.

2. Разбиение запросов на порции.

Если небольшие блоки запросов выполняются быстро - разделить 100к запросов на блоки по несколько тысяч и выполнять их по очереди.

3. Масштабирование БД

Добавить 1 или несколько slave-серверов и распределить запросы между ними, при необходимости - через балансировщик вроде haproxy.

Host4Biz: NVMe Хостинг в Европе ( https://host4.biz/ru/hosting/shared-hosting ) | Windows/Linux NVMe VPS в Европе ( https://host4.biz/ru/vps ) | Выделенные серверы в Европе, США и Азии ( https://host4.biz/ru/servers/dedicated )
P
На сайте с 06.01.2009
Offline
592
#10
NothingMatters:
Не вижу смысла делать сотни тысяч запросов тут.

100тыс запросов, это вообще все возможные комбинации фильтра.

Понимаете от куда такое число?

123 4

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