У меня есть один большой стол.
Давайте назовем это «единорогами».
И второй стол «фермеры».
Состав:
фермеры
единороги
И есть запрос:
SELECT
f.id,
f.name,
COUNT(*)
FROM
farmers f
LEFT JOIN unicorns u
ON u.farmer_id = f.id
GROUP BY f.id
Конечно, таблицы на самом деле названы не так и имеют больше полей и т. Д. Но я оставил только самые важные вещи в моем примере.
Проблема в том, что система растет, а единорогов слишком много. Миллионы.
И этот запрос (как-это) выполняется на странице списка фермеров.
И страница загружается не так быстро, как раньше, потому что мы присоединяемся к многомиллионной таблице каждый раз, когда загружаем страницу.
Проблема в следующем:
Если вам нужно оптимизировать это, как бы вы достигли этого результата?
Чтобы вы посоветовали?
Постскриптум
Лично я считаю, что мне нужно исключить соединение больших таблиц из основного запроса, рассчитать количество единорогов отдельно и сохранить их в кэш-памяти, пересчитывать их раз за разом. Может быть, есть лучший способ, поэтому я хотел услышать мнение другого человека.
Я бы просто имел дополнительный столбец на столе фермера для NumberUnicorns и сохранил бы его там. Затем, через некоторые триггеры базы данных, когда запись добавляется в таблицу единорога, она просто обновляет таблицу фермеров с соответствующим количеством из новой записи. Также рассмотрите возможность обновления счетчика, если записи единорога удалены. Затем ваш запрос сразу же из таблицы фермеров — готово.
Других решений пока нет …