Оптимизируйте запрос с помощью соединения больших таблиц

У меня есть один большой стол.

Давайте назовем это «единорогами».

И второй стол «фермеры».

Состав:

фермеры

  • Я бы
  • название
  • … еще несколько полей

единороги

  • Я бы
  • farmer_id
  • … еще несколько полей

И есть запрос:

SELECT
f.id,
f.name,
COUNT(*)
FROM
farmers f
LEFT JOIN unicorns u
ON u.farmer_id = f.id
GROUP BY f.id

Конечно, таблицы на самом деле названы не так и имеют больше полей и т. Д. Но я оставил только самые важные вещи в моем примере.

Проблема в том, что система растет, а единорогов слишком много. Миллионы.

И этот запрос (как-это) выполняется на странице списка фермеров.

И страница загружается не так быстро, как раньше, потому что мы присоединяемся к многомиллионной таблице каждый раз, когда загружаем страницу.

Проблема в следующем:

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

Если вам нужно оптимизировать это, как бы вы достигли этого результата?

Чтобы вы посоветовали?

Постскриптум

Лично я считаю, что мне нужно исключить соединение больших таблиц из основного запроса, рассчитать количество единорогов отдельно и сохранить их в кэш-памяти, пересчитывать их раз за разом. Может быть, есть лучший способ, поэтому я хотел услышать мнение другого человека.

-1

Решение

Я бы просто имел дополнительный столбец на столе фермера для NumberUnicorns и сохранил бы его там. Затем, через некоторые триггеры базы данных, когда запись добавляется в таблицу единорога, она просто обновляет таблицу фермеров с соответствующим количеством из новой записи. Также рассмотрите возможность обновления счетчика, если записи единорога удалены. Затем ваш запрос сразу же из таблицы фермеров — готово.

2

Другие решения

Других решений пока нет …