Оптимизация запросов 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
Другие вопросы по тегам