Здравствуйте.
Подскажите пожалуйста по такой ситуации. Есть вот такой запрос:
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