보고서를 생성하는 데 사용하는 쿼리를 최적화하려고합니다. 나는 약간 확장하기에 확실히 좋게 만들었다 것을 나는 생각한다. 내가 추가 열에서 실행이 일반 볼 때범위 쿼리에서 MySQL의 인덱스를 사용하지 않습니다.
select trat.asset_name as group_name,trat.name as sub_group_name,
trat.asset_id as group_id,
if(trat.cause_task_type='AccessRequest',true,false) as is_request_task,
'' as grouped_on,
concat(trat.asset_name,' - {0} (',count(*),')') as table_heading
from t_remote_agent_tasks trat
where trat.status in ('completed','failedredundant')
and trat.name not in ('collect-data','update-conn-params')
group by trat.asset_name, trat.name
order by field(trat.name,'create-account','change-attr',
'add-member-to-group',
'grant-access','disable-account','revoke-access',
'remove-member-from-group','update-license')
는, filesort를 임시 사용하여 위치를 사용하여 말한다 : 다음은 원래 쿼리이었다.
그래서 나는 최적화 나에게 일시 사용, 어디에 사용하는 것과 실행 계획을주는이select trat.asset_name as group_name,trat.name as sub_group_name,
trat.asset_id as group_id,
if(trat.cause_task_type='AccessRequest',true,false) as is_request_task,
'' as grouped_on,
concat(trat.asset_name,' - {0} (',count(*),')') as table_heading
from t_remote_agent_tasks trat
where trat.status in ('completed','failedredundant')
and trat.name not in ('collect-data','update-conn-params')
group by trat.asset_name,trat.name
order by null
같은 쿼리. 따라서 filesort는 더 이상 사용하지 않으며 옵티마이 저는 정렬 할 필요가 없으므로 추가 오버 헤드가 없으며 그룹별로 처리됩니다.
그룹별로 언급 한 순서대로 그룹별로 색인을 생성했습니다 (중요하거나 최적화되지 않습니다). 즉 (trat.asset_name, trat.name)에 색인을 생성합니다. 이제이 최적화는 나를 여분의 열에 만 사용합니다. 또한 쿼리 실행 시간은 거의 절반으로 추측됩니다 (이전에는 0.568 초 였지만 현재는 0.345 초입니다. 정확하지는 않지만 매번 변경되지만이 범위에서 더 많거나 적음).
가 지금은 쿼리의 일부가 아래 범위 쿼리를 최적화 할
trat.status in ('completed','failedredundant')
and trat.name not in ('collect-data','update-conn-params')
내가하지 말한다 mysl reference guide to optimize range query에 읽고있다 범위 쿼리에없는, 그래서 나는이
같은 쿼리에서 수정을했다trat.status in ('completed','failedredundant')
and trat.name in ('add-member-to-group','change-attr','create-account',
'disable-account','grant-access', 'remove-member-from-group',
'update-license')
그러나 Extra에서는 아무런 개선점도 보이지 않습니다. (색인을 사용해야 함은 여전히 어디에서 사용하고 있는지 나타냅니다.) 또한 두 범위 부분을 유니온으로 분할하여 시도했지만 쿼리 결과는 변경되지만 실행 계획은 개선되지 않습니다.
이 쿼리를 더 많이 최적화하는 방법에 대한 도움이 필요합니다. 대부분 범위 부분 (부분적으로) . 다른 최적화가 필요하다면 어떻게해야합니까?
은 내가, 나 또한 trat.status에 인덱스가 언급에 잊었다 미리 감사드립니다
EDIT 1 그래서 다음은 인덱스
- (trat.asset_name, 뜨랏입니다, 당신의 시간을 주셔서 감사합니다. 이름)
- (trat.status) 거의 모든 경우에
덕분에 많은 도움이됩니다. – user3817378