복합인덱스 설계 질문
110
1 asked
안녕하세요 영한님, 영한님의 강의로 열심히 학습중인 학생입니다!
실전 진단 - 해결 방안2에서 복합인덱스 관련해 궁금증이 있습니다.
영한님의 강의에서는 (category_id, product_status, created_at)을 복합인덱스로 설정하셨는데, (category_id, created_at)을 복합인덱스로 설정하는 것에 대해서는 어떻게 생각하시는지 궁금합니다.
product_status = 'ACTIVE'의 비율이 전체 테이블에 비교했을 때 전체의 85%였고, 이 price 조건을 비교하기 위해 클러스터드 인덱스가 접근해 행 전체를 읽은 후 실행엔진에서 걸러야하는데, product_stauts = 'ACTIVE' 비율이 85%에 해당되기 때문에 높은 확률로 통과하다 보니 인덱스 효용이 떨어질 것 같다는 생각이 들었습니다.
그래서 해당 쿼리를 생각했을 때 product_status도 복합인덱스에 추가할만한 가치가 있을까? 라는 질문을 던졌을 때 (영한님이 말씀해주신 것 처럼, 인덱스도 결국 비용이니깐) 크게 와닿지 못 했는데, 이와 관련해서 영한님의 의견이 궁금합니다!
(두 복합 인덱스의 실행 계획)
-- (category_id, created_at)
-> Limit: 20 row(s)
(cost=75331 rows=20)(actual time=0.719..11.5 rows=20 loops=1)
-> Filter: ((product.price between 10000 and 50000) and (product.product_status = 'ACTIVE'))
(cost=75331 rows=4595) (actual time=0.718..11.5 rows=20 loops=1)
-> Index lookup on product using idx_category_created_at (category_id=11)
(cost=75331 rows=413612) (actual time=0.698..11.4 rows=48 loops=1)
-- (category_id, product_status, created_at)
-> Limit: 20 row(s)
(cost=78697 rows=20)(actual time=0.6..9.07 rows=20 loops=1)
-> Filter: (product.price between 10000 and 50000)
(cost=78697 rows=38255) (actual time=0.593..9.06 rows=20 loops=1)
-> Index lookup on product using idx_category_status_created_at (category_id=11, product_status='ACTIVE')
(cost=78697 rows=344330) (actual time=0.581..9.03 rows=40 loops=1)
Answer 1
1
안녕하세요. 이성우님
말씀하신 것처럼 product_status = 'ACTIVE' 비율이 85%라면 선택도가 낮기 때문에, (category_id, product_status, created_at)으로 확장했을 때 얻는 이득은 크지 않을 수 있습니다.
실행 결과에서도 48건 → 40건으로 줄어드는 정도이니까요.
그래서 이 정도라면 (category_id, created_at)만 사용하는 것도 충분히 합리적인 선택입니다. 인덱스도 저장 공간과 변경 비용이 있기 때문입니다.
다만 판단할 때는 전체 테이블의 ACTIVE 비율보다 해당 category_id 내부에서 ACTIVE 비율이 얼마나 되는지를 보는 것이 더 중요합니다.
결국 두 인덱스 모두 가능한 선택이고, 실제 데이터 분포와 쿼리 빈도, 성능 차이를 측정해서 결정하는 것이 가장 좋습니다.
감사합니다 :)
선생님 샤딩에 대한 강의도 좀 해주세요
0
12
1
몽고DB CAP 이론 관련
0
18
2
아니 이거 갑자기 데이터베이스가 사라졌어요
0
18
1
기타 영역 중 언두로그
0
21
0
ReviewPolicyValidator와 ReviewManger내의 if문
0
32
1
코드 깃허브는 없을까요?
1
43
2
실전튜닝 4 질문 - group by 순서와 index 순서
0
47
1
@Modifying에 관하여
1
45
1
가중이동평균매출 lag함수 활용
0
65
2
'Canvas 설정과 배경 설정’ 부분에 대해 질문드립니다.
1
55
1
DB 쿼리 최적화 시 DB 처리와 애플리케이션 처리의 기준이 궁금합니다
0
54
1
디비를 조작하는데 사용하는 명령어가 ORM인가요?
0
50
2
실무에서의 인덱스 관리 방법이 궁금합니다
0
60
1
Group By 절에 작성하는 컬럼 문의드립니다.
0
85
3
Issuance 테이블에 status, couponId 인덱스가 꼭 필요할까요?
2
66
1
ProductController 에서 타협하지 않는다면 어떤 형태가 되나요?
1
61
2
이진 트리 노드
0
67
1
통계정보 갱신 질문
0
104
2
PK 관련하여 궁금한 점이 있어서 질문 드립니다.
0
109
2
탐색을 한번 더 하지 않게 하는 방식 중 어댑티브 해시 방식도 맞는지 궁금 합니다.
0
101
2
컬럼 크기가 대용량인 경우 DB 버퍼 풀에 전부 올라오는지 궁금합니다
0
102
2
실습데이터 ORDERS 생성 시간 질문요...
0
133
3
MySQL 서버구조 쿼리파서 질문 있습니다 !
0
94
1
Postgresql 아키텍처 업데이트
1
111
2

