MySQL · MySQL 8.4.6
В Shopify у каждого пода свой шард MySQL, магазины распределены по подам по shop_id. Со временем самый загруженный и самый лёгкий шард разошлись почти в 4 раза — магазины пришлось переносить.
pods — поды, shops — в каком поде магазин, shop_load — сколько секунд БД магазин потратил за день. Для каждого пода из pods верните pod_id, shops — число магазинов, load_sec — сумму db_seconds за октябрь 2025 (0, если нагрузки нет), load_rank — место по load_sec по убыванию через RANK(): равные делят место, следующее место пропускается.
Порядок — по load_rank, затем по pod_id.
В работе: Планирование переноса магазинов: какие поды разгружать, а какие принимают новых.
Источник: кейс Shopify: балансировка шардов MySQL между подами, 2021. Условие пересказано своими словами.
Какие запросы вернут рейтинг подов за октябрь 2025?
- COUNT(sh.shop_id) без DISTINCT
- Фильтр по дате в ON, COUNT(DISTINCT), RANK()
- Фильтр по дате в WHERE
- Коррелированные подзапросы и ранг через COUNT большего
- MONTH(l.day) = 10