@Dark_Dante

Как оптимизировать запрос?

Здравствуйте.
Подскажите пожалуйста по такой ситуации. Есть вот такой запрос:
SELECT id, desctipription, IF (
EXISTS(
SELECT * FROM tree AS tree2 
WHERE tree2.parent_id=tree.id
)
1,0
) AS descendants
 FROM tree 
WHERE tree.parent_id=<ид_родителя> AND EXISTS (
SELECT * FROM articles WHERE tree.id=articles.tree_id LIMIT 1);

Грубо говоря, запрос выбирает все дочерние ветки для данного id, их идентификатор, имя, признак, есть ли у нее потомки, если этой ветке принадлежит хоть одна запись в таблице articles. Все это дергается рекурсией и строится красивое дерево категорий. Но, есть одно "но". В таблице articles примерно 147 миллионов записей. Хоть индексы и стоят по полям, запрос выполняется долго, примерно пару секунд. А так как все это дело делается еще и в рекурсивном вызове, то время построения дерева может доходить до минуты а то и нескольких минут.
При помощи EXPLAIN видно, что тормоза вызывает именно подзапрос проверки наличия хоть одного артикула, относящегося к этой ветке.
Подскажите пожалуйста, как ускорить данный запрос?
P.S. Все таблицы в InnoDB
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Перейти на NestedSet, там признак листа left = right-1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы