Оптимизация запросов MySQL для производных запросов и запросов на комбинированные запросы
Следующий вид запросов выполняется на сервере, который использует производную таблицу и подзапрос. Ограничение состоит в том, что подзапросы генерируются из нескольких модулей на основе текущей ситуации, поэтому они не могут реально преобразовать их в комбинацию соединений.
Пожалуйста, предложите возможное решение для оптимизации запроса
SELECT COUNT(1)
AS total
FROM member tlb_m
where tlb_m.active = 1
and tlb_m.rank > 0
and tlb_m.member_id not in (5735,134,241,1055,348,272,476,43,7,804,7548,90,229,346,40895)
and tlb_m.type = 'M'
and (tlb_m.hometown_list_id in
(SELECT l2.list_id
FROM ((
SELECT t12.list_id
from list_tree_idx t12
INNER JOIN list_tree_idx t11
ON t12.list_parent_id=t11.list_id
where t11.list_parent_id='205546'
) UNION ALL (
SELECT list_id
from list_tree_idx
where list_parent_id='205546'
) ) as l2
) or tlb_m.hometown_list_id = 205546
)
1 ответ
Я бы предложил использовать таблицу закрытия для оптимальных иерархических запросов. Например, имея таблицу закрытия со столбцами ANCESTOR_ID, CHILD_ID и DEPTH, ваш запрос будет выглядеть так
SELECT COUNT(1) AS total
FROM member AS tlb_m
LEFT JOIN hometown_closure AS c ON c.child_id = tlb_m.hometown_list_id
where tlb_m.active = 1
and tlb_m.rank > 0
and tlb_m.member_id not in (5735,134,241,1055,348,272,476,43,7,804,7548,90,229,346,40895)
and tlb_m.type = 'M'
and c.ancestor_id = 205546