우아한 프로그래밍

1. 문제상황

데이터베이스에서 우리는 조회속도를 높이기 위해서 인덱스를 사용합니다.
하지만 어떠한 경우에 타지 않는데 그 이유를 모르곤 합니다.

인덱스를 타지 않는 경우는 아래의 글에서 참조하세요.

2019/05/15 - [개발자 이야기] - [데이터베이스] 인덱스를 타지 않고 풀스캔을 하는 경우에 대해서 알아보자.!

불러오는 중입니다...

위 경우가 아니어도 결합인덱스의 특수한 경우에도 인덱스를 타지 않습니다. 알아보도록 합시다.

2. 사용예시

TB_USER 라는 테이블이 존재한다고 가정해봅시다.
또 TB_USER에는 (ID, NAME)이 결합인덱스로 설정되었다고 가정해봅시다.

그리고 아래의 쿼리를 호출했을시 과연 어떨까요?

SELECT ID, NAME
  FROM USER
 HWERE NAME = '홍길동'

위 경우에는 인덱스를 타지 않습니다.

결합인덱스의 경우 첫번째 컬럼이 사용되지 않는다면 그 결합인덱스는 사용되지 않습니다.

자 그러면 아래의 경우는 어떨까요?

SELECT ID, NAME
  FROM USER
 HWERE NAME = '홍길동' AND ID LIKE 'A%'

위와 같은 경우는 인덱스를 탑니다. 하지만 효과적이지 않다는 것을 이해해야합니다.
결합 인덱스의 경우 옵티마이저의 모든 기능을 이해 할 수는 없지만 컬럼의 순서대로 1차필터링, 2차필터링, 3차필터링을 한다고 이해하시면 편할 것같습니다.

위 쿼리의 경우 1차필터링으로 사용된 ID가 LIKE 검색을 사용하여 많은 필터처리하지 못했습니다. 
다시 말해 이름으로 필터링하고 ID로 범위(Range)검색을 하는 편이 더 낫다는 것이죠.

즉 결합인덱스를 (NAME, ID)순으로 만드는 것이 더 효과적이다는 이야기입니다.

즉 쿼리가 어떤식으로 필터처리를 하는게 더 효과적인지 이해하시고 결합인덱스를 만드신다면 보다 빠른 결과를 얻을 수 있지 않을까 생각해봅니다.

 

profile

우아한 프로그래밍

@자바조아!

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!