쿼리 코스트와 실행 속도 사이의 연관 관계가 어떻게 되나요? 0 2 1,575

by 멍돌 [MySQL] DB sql mysql [2021.07.01 16:27:21]


안녕하세요.

실행 계획을 보며 쿼리 튜닝을 하던 중 의문이 발생했는데요.

기존 쿼리 상에서 Full index scan을 하는 경우 코스트가 1천대에 실행 속도가 0.25msec 정도 나오다가

index range scan으로 변경하니 코스트가 7천대가 되면서 실행 속도가 0.15msec 정도로 줄어들더라구요.

코스트가 낮은 경우에 속도가 더 빠를 거라고 생각했는데

코스트는 늘고 속도는 줄어들어서 어떤 걸 기준으로 쿼리를 튜닝해야하는 지 궁금해졌습니다.

총 데이터는 14만건 들어있으며 인덱스는 서브 쿼리 내에서 사용됩니다.

코스트와 속도의 연관관계는 어떻게 되고, 둘 중 무엇을 기준으로 쿼리를 튜닝해야 하나요?

 

추가)

select concat('2021-06-', tempDay) useDate, m.title, ifnull(l.count,0) count
from (
	with recursive cte as 
		(
		select 1 as tempDay
		union all
		select cte.tempDay+1 from cte
		where cte.tempDay < day(last_day('2021-06-01'))
		) 
    select lpad(tempDay, '2', '0') tempDay
	from cte
    ) td
left join tbl_menu m on 1=1 
left outer join 
	( 
	select date_format(useDate, '%Y-%m-%d') useDate, 
	menuId,  count(menuid) count 
	from tbl_menu_log l 
	where useDate between '2021-06-01' and '2021-07-01' 
	group by date_format(useDate, '%Y-%m-%d'), menuId 
	) l 
on concat('2021-06-', tempDay) = l.useDate 
and l.menuId = m.id order by tempDay, m.orderId;

쿼리는 위와 같고

full index scan에 사용된 인덱스는 tbl_menu_log 테이블의 menuId, useDate 컬럼 순이며

index range scan에 사용된 인덱스는 같은 테이블의 useDate, menuId 순입니다.

menuId는 int 값이 들어있고 useDate는 timestamp 입니다.

by 마농 [2021.07.01 17:34:04]

자료 처리량 관점으로 보면
전체 자료를 읽는 full 보다는 필요한 자료만 읽는 range 가 더 좋습니다.
딱 한가지 관점으로만 보면 안되고 여러가지 관점으로 바라봐야 합니다.


by 멍돌 [2021.07.01 20:16:42]

그렇군요... 덕분에 하나 배워갑니다.

감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입