실전튜닝 4 질문 - group by 순서와 index 순서
4
投稿した質問数 1
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) 가 선행컬럼을 기준으로 정렬되어 존재하니깐용
감사합니다!
回答 0
@Modifying에 관하여
1
20
1
3-13 과제
0
22
1
가중이동평균매출 lag함수 활용
0
32
2
battle 테이블 오류
0
47
2
'Canvas 설정과 배경 설정’ 부분에 대해 질문드립니다.
1
38
1
DB 쿼리 최적화 시 DB 처리와 애플리케이션 처리의 기준이 궁금합니다
0
40
1
디비를 조작하는데 사용하는 명령어가 ORM인가요?
0
34
2
실무에서의 인덱스 관리 방법이 궁금합니다
0
47
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
98
1
이진 트리 노드
0
64
1
통계정보 갱신 질문
0
95
2
PK 관련하여 궁금한 점이 있어서 질문 드립니다.
0
102
2
탐색을 한번 더 하지 않게 하는 방식 중 어댑티브 해시 방식도 맞는지 궁금 합니다.
0
92
2
컬럼 크기가 대용량인 경우 DB 버퍼 풀에 전부 올라오는지 궁금합니다
0
92
2
실습데이터 ORDERS 생성 시간 질문요...
0
130
3
MySQL 서버구조 쿼리파서 질문 있습니다 !
0
82
1
Postgresql 아키텍처 업데이트
1
103
2

