안녕하세요.
실행 계획을 보며 쿼리 튜닝을 하던 중 의문이 발생했는데요.
기존 쿼리 상에서 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 입니다.