inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Cơ sở dữ liệu thực chiến của Kim Young-han - Tối ưu hóa hiệu năng, làm chủ hoàn toàn kế hoạch thực thi và chỉ mục

Chẩn đoán thực tiễn - Giải pháp 2

복합인덱스 설계 질문

32

spqjekdl10040532

1 câu hỏi đã được viết

0

안녕하세요 영한님, 영한님의 강의로 열심히 학습중인 학생입니다!


실전 진단 - 해결 방안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)

mysql dbms/rdbms sql-tuning

Câu trả lời 1

1

yh

안녕하세요. 이성우님

말씀하신 것처럼 product_status = 'ACTIVE' 비율이 85%라면 선택도가 낮기 때문에, (category_id, product_status, created_at)으로 확장했을 때 얻는 이득은 크지 않을 수 있습니다.

실행 결과에서도 48건 → 40건으로 줄어드는 정도이니까요.

그래서 이 정도라면 (category_id, created_at)만 사용하는 것도 충분히 합리적인 선택입니다. 인덱스도 저장 공간과 변경 비용이 있기 때문입니다.

다만 판단할 때는 전체 테이블의 ACTIVE 비율보다 해당 category_id 내부에서 ACTIVE 비율이 얼마나 되는지를 보는 것이 더 중요합니다.

결국 두 인덱스 모두 가능한 선택이고, 실제 데이터 분포와 쿼리 빈도, 성능 차이를 측정해서 결정하는 것이 가장 좋습니다.

감사합니다 :)


build 시 에러 해결방법 공유(docker.desktop 업데이트 -> 의존성 버전 수정)

0

9

1

실습 데이터(PostgreSQL 백업 파일) 관련하여 문의드립니다. (Hive 환경 실습)

0

9

1

sakila 실전 17번 문제

0

12

1

수강 완료한 강의 수료증 어떻게 받나요?

0

12

1

ArticleReadService 관련 질문

0

26

1

마스터패스...

0

35

1

kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.

1

59

1

SubStack 신청 완료했습니다!

0

22

2

domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다

1

43

1

노드

0

32

1

아무도 모르게 책 내시면 모르실 줄 알고!!

1

48

2

Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면

1

71

1

스크립트에 대해 질문 있습니다.

1

58

1

같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!

2

70

1

리뷰

0

43

2

조건 검색 질문

0

39

1

이진 트리 노드

0

48

1

통계정보 갱신 질문

0

69

2

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

0

75

2

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

0

74

2

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

0

69

2

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

0

101

3

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

0

73

1

Postgresql 아키텍처 업데이트

1

90

2