inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)

[실습] WHERE문이 사용된 SQL문 튜닝하기 - 2

28

dongdong2

작성한 질문수 4

0

안녕하세요. 강의 잘 보고 있습니다!


[실습] WHERE문이 사용된 SQL문 튜닝하기 - 2

해당 강의에서 질문이 있습니다 :)


이전 강의에서 멀티 컬럼 인덱스의 경우,

첫번째 컬럼 기준으로 먼저 정렬하고, 그 다음 두번째 컬럼 기준으로 정렬한다고 배웠던 것 같습니다!


따라서

idx_created_at <-> idx_created_at_department 실행계획
idx_department <-> idx_department_created_at 실행계획이

각각 비슷할 것이라고 예상했는데, 강의에서는 idx_created_at과 두 개의 멀티 컬럼 인덱스 idx_created_at_department, idx_department_created_at 가 비슷하다는 것을 알 수 있었습니다!


이유가 궁금하여 질문 남겨봅니다 !


sql mysql dbms/rdbms query-tuning

답변 2

0

JSCODE 박재성

안녕하세요 ! 질문 잘 해주셨어요~

질문해주신 내용에 대해 답변드려볼게요!

우선 멀티 컬럼 인덱스는 '정렬 순서'만 다른 게 아니라, 인덱스 표 안에 컬럼이 2개 다 들어있다는 점이 핵심이에요 !

(department) 인덱스만 걸었을 때는 인덱스 표에 department 값밖에 없어요 !

그래서 department = 'Sales'인 데이터 10만 개를 인덱스에서 찾아낸 뒤, created_at 조건을 확인하려면 실제 테이블로 하나하나 다 찾아가야 해요 ! 그래서 rows가 191,314처럼 크게 잡히고 성능이 덜 향상됐던 거예요 !

반면 (department, created_at) 멀티 컬럼 인덱스는 인덱스 표 안에 created_at까지 들어있어요 !

department = 'Sales'로 범위를 좁힌 뒤, 그 안에서 created_at이 이미 정렬되어 있으니 최근 3일치 구간만 인덱스 안에서 바로 찾아낼 수 있어요 ~

실제 테이블에 접근하는 데이터가 100개 수준으로 확 줄어드는 거죠!

(created_at, department)도 마찬가지로 created_at으로 1,100개 정도로 좁힌 뒤, department 값도 인덱스에 있으니 인덱스 안에서 걸러낼 수 있어요 ~

결국 두 멀티 컬럼 인덱스 모두 '실제 테이블에 액세스하는 데이터 수'가 적어지기 때문에, idx_created_at과 비슷한 성능이 나오게 된 거죠 !

이 외로 궁금하신 점 있으시면 또 질문 남겨주세요~~

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. dongdong2님께서 질문해 주셔서 감사합니다!

멀티 컬럼 인덱스에서의 인덱스 사용 방식을 이해하는 데는 약간의 혼동이 있을 수 있습니다. 우선, 멀티 컬럼 인덱스는 정의된 순서에 따라 정렬되고 활용되며, 인덱스가 어떻게 사용되는지는 쿼리에 따라 다소 다르게 작용할 수 있습니다.

멀티 컬럼 인덱스 이해하기

  1. 순서와 활용: 멀티 컬럼 인덱스는 정의된 컬럼의 순서에 따라 사용됩니다. 예를 들어, 인덱스가 idx_created_at_department로 정의되었다면, created_at을 기준으로 먼저 정렬되고, 같은 created_at값에 대해 department로 정렬됩니다.

  2. 인덱스 사용 우선순위: 쿼리에서는 항상 첫 번째 컬럼을 우선적으로 사용합니다. idx_created_at_department일 때 created_at으로 특정 검색을 하면 매우 효과적으로 작동합니다. 반면, idx_department_created_atdepartment를 첫 번째 컬럼으로 사용하여 인덱스를 최적으로 활용하지 못할 수 있습니다.

  3. 비슷한 성능 이유: idx_created_at 단일 인덱스와 idx_created_at_department가 비슷한 성능을 보이는 이유는, 검색 시 created_at을 사용하여 필터링할 때 동일한 방식으로 인덱스를 활용하기 때문입니다. 그러나 idx_department_created_atcreated_at을 두 번째로 검색해야 하므로 효율이 떨어질 수 있습니다.

이와 관련된 내용을 다룬 게시물이 도움이 될 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

[실습] 인덱스 직접 설정해보기/성능 측정해보기

0

32

2

큰 범위 조회 시 EXPLAIN의 rows 값이 정확하지 않은 이유가 궁금합니다.

0

65

2

쿼리 결과 그리드에서 TYPE, POSSIBLE_KEYS 다릅니다

0

101

3

강의 내용을 블로그에 정리해도 괜찮을까요?

1

138

2

여러 테이블 조인시 where 절이 필요한가? 에 대해 질문있습니다.

0

165

2

풀 인덱스 스캔 질문있습니다.

0

139

2

멀티컬럼인덱스 질문있습니다.

0

146

2

쿼리 튜닝 관련 질문 (limit)

0

135

1

페이지기반 페이지네이션 쿼리를 최적화하고 싶습니다.

0

183

2

측정 시간 차이

0

222

2

[실습] 인덱스 직접 설정해보기 / 성능 측정해보기 강의에서요.

0

217

1

커버링 인덱스(Covering Index)강의에서 질문이있습니다.

0

201

2

한 번에 너무 많은 데이터를 조회하는 SQL문 튜닝하기 질문입니다

0

287

3

ORDER BY 튜닝관련 문의

0

218

2

강의 질문 있습니다

0

134

2

인덱스 많은 테이블에서 데이터 많아질 수록 insert 속도 증가

0

483

3

MariaDB 사용 시 EXPLAIN ANALYZE 이용 불가 문의

1

632

2

SQL 튜닝에 대한 사례나 Best Practice 등을 모은 자료를 알려주실 수 있나요?

0

347

2

혹시 심화 수업은 계획이 없으신가요..?

0

302

1

jpa쿼리튜닝 팁이 궁금합니다.!

0

460

1

특정 부서에서 최대 연봉을 가진 사용자 조회 sql 쿼리 질문

4

257

1

created_at 에 index 거는것과 지속적인 데이터 증가

0

456

2

WHERE A OR B 에서 인덱스 걸기

0

398

2

질문이있습니다.

1

332

1