a-kai
Новичок
Посоветуйте как сделать, плз.
На сайте есть товары и каталог с (предположим) неограниченной вложенностью.
Товары могут лежать как в одном разделе каталога, так и в нескольких.
Каталог сделан с помощью nested sets.
В итоге получается вот что.
items
id | title
category
id | title | root_id | lft | rgt | level
items_category
id | items_id | category_id
В таблице ItemsCategory для каждого товара есть запись только о нижнем разделе каталога.
Товаров - около 250-300 тысяч и количество растет.
Каталог - около 15 тысяч записей. Растет медленно.
Теперь сам вопрос. Если мне нужно выбрать все товары из неконечного раздела каталога, то я выполняю такой запрос:
SELECT
*
FROM
items_category ic
LEFT JOIN items i
ON (i.id = ic.items_id)
LEFT JOIN category c
ON (c.id = ic.category_id)
WHERE
(c.root_id = '#нужный корневой элемент#' AND
c.lft >= '#lft нужного мне раздела#' AND
c.rgt <= '#rgt нужного мне раздела#')
GROUP BY
ic.items_id;
Все выбирается правильно, но долго.
Как оптимизировать?
P.S.
Думаю еще над вариантом записывать в items_category все разделы для каждого товара, а затем выбирать только те товары, для которых есть запись в items_category с нужным разделом. Может попробовать его?
На сайте есть товары и каталог с (предположим) неограниченной вложенностью.
Товары могут лежать как в одном разделе каталога, так и в нескольких.
Каталог сделан с помощью nested sets.
В итоге получается вот что.
items
id | title
category
id | title | root_id | lft | rgt | level
items_category
id | items_id | category_id
В таблице ItemsCategory для каждого товара есть запись только о нижнем разделе каталога.
Товаров - около 250-300 тысяч и количество растет.
Каталог - около 15 тысяч записей. Растет медленно.
Теперь сам вопрос. Если мне нужно выбрать все товары из неконечного раздела каталога, то я выполняю такой запрос:
SELECT
*
FROM
items_category ic
LEFT JOIN items i
ON (i.id = ic.items_id)
LEFT JOIN category c
ON (c.id = ic.category_id)
WHERE
(c.root_id = '#нужный корневой элемент#' AND
c.lft >= '#lft нужного мне раздела#' AND
c.rgt <= '#rgt нужного мне раздела#')
GROUP BY
ic.items_id;
Все выбирается правильно, но долго.
Как оптимизировать?
P.S.
Думаю еще над вариантом записывать в items_category все разделы для каждого товара, а затем выбирать только те товары, для которых есть запись в items_category с нужным разделом. Может попробовать его?