Мой вопрос касается выбора лучшего метода для выполнения работы.Я представлю цель и мои различные решения.
У меня есть список предметов и список категорий.каждая может принадлежать к нескольким категориям.
items (id, name, ...other fields...)
categories (id, name, ...... )
category_items (category_id, item_id)
список предметов очень большой и обновляется каждые 10 минут (с использованием cron).список категорий фиксирован.
на моей странице, я показываю большой список элементов, и у меня есть фильтры категорий.Вся фильтрация выполняется на клиентском JavaScript.Причина в том, что количество доступных в настоящее время элементов ограничено + - 1000, поэтому все данные (элементы + категории) будут загружаться вместе.
эта страница будет просматриваться много раз, поэтому производительностьпроблема здесь.У меня есть несколько идей, обе приведут к хорошей производительности.во всех них будет отправлен полный список категорий.однако элементы ...
, выполняющие одиночный выбор, используя join и group_concat.что-то вроде этого:
SELECT i. *, GROUP_CONCAT (ci. category_id
SEPARATOR ",") AS category_list FROM items
AS I LEFT JOIN category_items
AS ci ON (ci. item_id
= i. id
) WHERE ... GROUP BY i. id
ORDER BY ...
создание представления с указанным выше
- сохранение результата GROUP_CONCAT в качестве дополнительного столбца.это будет обновляться только каждые несколько минут в cron.
индексация выполняется правильно, поэтому все методы будут работать относительно быстро.объединение - сложная операция, поэтому мой вопрос о (2), (3):
обновляется ли представление только для каждого CRUD или оно рассчитывается для каждого выбора?если он обновляется только в CRUD, он должен быть примерно таким же, как при хранении столбца.
Помните, что таблица элементов будет расти и будут выбраны только последние строки.