inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

실전튜닝 4 질문 - group by 순서와 index 순서

2

gmldk3214

작성한 질문수 1

0

SELECT m.member_id, m.member_name, m.grade,
   COUNT(o.order_id) AS order_count,
   SUM(o.total_price) AS total_spent
FROM member m
JOIN orders o ON m.member_id = o.member_id
WHERE m.grade = 'VIP'
GROUP BY m.member_id, m.member_name, m.grade
ORDER BY total_spent DESC
LIMIT 20;

안녕하세요!

해당 쿼리에서는 group by 순서가

member_id, member_name, grade 순으로 되어있습니다.

강의에서는 group by 는 그룹핑을 할때
(member_id, member_name, grade) 을 기준으로 그룹핑 하여 순서가 상관없지만
인덱스 순서를 GROUP BY 순서에 맞게 인덱스를 설계 해야한다고 하셨습니다.


grade 는 where 절에서 vip 상수로 필터링 하므로
인덱스에서 가장 왼쪽(앞)에 와야하지만
왜 member_id, member_name 순서에 맞게 인덱스를 줘야하는지 잘 모르겠습니다.

실제로 (grade, member_name, member_id) 순서로 member 테이블에 인덱스를 주고
EXPLAIN ANALZYZE 를 해보니

Aggregate using temporary table (actual time=373..373 rows=59999 loops=1)
가 나오는것을 확인했습니다.


임시테이블을 만들지 말지의 기준은
GROUP BY 로 그룹핑 하는 대상들이 연속적으로 올 경우는 굳이 임시테이블을 만들 필요가 없다는것으로 이해를 했습니다.(순서대로 오니까 미리 저장할 필요가 없으므로)

하지만 인덱스를 (grade, member_name, member_id) 순서로 줄 경우도 결국 인덱스 Grouping 순서에 맞게 오니까 임시테이블을 만들 필요가 없으니까 using temporary table 역시 발생하지 않아야 하는거 아닌가요?


그리고 설령(grade, member_name, member_id) 로 주지 않고
(grade, member_name) 로 member테이블에 인덱스를 걸더라도 되는거 아닌가요?
어차피 세컨더리 인덱스 리프노드에는 member_id(pk) 가 선행컬럼을 기준으로 정렬되어 존재하니깐용

감사합니다!

sql mysql dbms/rdbms sql-tuning SQLD

답변 0

@Modifying에 관하여

1

20

1

3-13 과제

0

22

1

가중이동평균매출 lag함수 활용

0

31

2

battle 테이블 오류

0

47

2

'Canvas 설정과 배경 설정’ 부분에 대해 질문드립니다.

1

38

1

DB 쿼리 최적화 시 DB 처리와 애플리케이션 처리의 기준이 궁금합니다

0

39

1

디비를 조작하는데 사용하는 명령어가 ORM인가요?

0

34

2

실무에서의 인덱스 관리 방법이 궁금합니다

0

46

1

Group By 절에 작성하는 컬럼 문의드립니다.

0

61

3

Issuance 테이블에 status, couponId 인덱스가 꼭 필요할까요?

2

59

1

ProductController 에서 타협하지 않는다면 어떤 형태가 되나요?

1

45

2

문제와 풀이2 1번문제

0

31

1

1번 문제 질문

0

55

2

3-13 리텐션 과제 제출합니다

0

65

2

부하 테스트 시 설정 관련 질문드립니다

1

83

2

복합인덱스 설계 질문

0

97

1

이진 트리 노드

0

63

1

통계정보 갱신 질문

0

95

2

PK 관련하여 궁금한 점이 있어서 질문 드립니다.

0

101

2

탐색을 한번 더 하지 않게 하는 방식 중 어댑티브 해시 방식도 맞는지 궁금 합니다.

0

91

2

컬럼 크기가 대용량인 경우 DB 버퍼 풀에 전부 올라오는지 궁금합니다

0

92

2

실습데이터 ORDERS 생성 시간 질문요...

0

130

3

MySQL 서버구조 쿼리파서 질문 있습니다 !

0

82

1

Postgresql 아키텍처 업데이트

1

103

2