y, которые поверх шадированных таблиц x_sh и y_sh, x_sh по сути является матвью для y_sh, чуть урезаны столбы + другая сортировка. Надо найти условного пользователя, с набором товаров, похожим на набор товаров искомого пользователя. Выполняю запрос
select userid, count() cnt from db.x where productid in (select productid from db.y_sh where userid=123) group by userid having cnt>10 order by cnt desc limit 0, 10
если я все правильно понимаю, то происходит следующее:
1. на каждом шарде, из таблицы y_sh, выбирается, какие продукты купил пользователь 123
2. id продуктов сливаются на вызывающий хост
3. вызывающий хост раздает запросы шардам на выборку из таблицы x_sh тех корзин, где пользователи покупали продукты из списка, полученного в первой итерации
4. userid и факты наличия корзин льются на вызывающий хост
5. вызывающий хост завершает агрегации, суммируя результаты, сортируя и фильтруя по числу общих товаров.
Все хорошо, но много действий
У меня все шардировано по товарам, т.е. данные с разных шардов можно было бы просто суммировать. Как бы мне это сделать не поднимая 4 разных коннекта и не перенося логику на сторону приложения?
т.е. хочется выполнить на каждом шарде
select userid, count() cnt from db.x_sh where productid in (select productid from db.y_sh where userid=123) group by userid order by cnt desc limit 0,100
и следом на агрегирующем уже выполнить нечто типа
select userid, sum(cnt) from (..) group by userid having cnt>10 limit 0,10
таким образом итераций должно быть меньше + по сети не будут переливаться потенциально большие куски данных (например, несколько сотен тысяч условных товаров на итерациях 2 и 3 + тысячи пользователей на итерации 4)
Спасайте, что то я в тупике и не могу додумать)
При первом подходе, в моей инфраструктуре, для тежелого объекта данные считаются условно за 12 секунд, при выборке на одном шарде - 8 секунд (сверху прилетят еще аграгации, но там будут совсем крошки, 4 шарда по 100 записей).
ээ нет. Работает именно как вы хотите. Можно выключить группировку финальную на инициаторе если вас шардировано по userid.
Обсуждают сегодня