Backend/Database

인덱스 꼼수 부리기

mopil 2024. 9. 4. 01:00
반응형

 

# != 연산에 인덱스 태우기

where 절의 not equal(!=) 연산은 인덱스를 걸어놔도 효과를 볼 수 없다.

 

이런 경우 해당 칼럼이 순차적인 코드값으로 되어있는 경우는 인덱스를 태우도록 꼼수(?)를 부릴 수 있다.

 

* 디비는 오라클 기준

 

예를 들어, my_table이 존재하고 my_column이 이런 분포를 가진다고 해보자.

 

1000 : 32만 rows

2000 : 10만 rows

3000 : 5만 rows

4000 : 22만 rows

5000 : 1만 rows

6000 : 43만 rows

 

그리고 my_column이 1000이 아닌 rows를 select 한다고 가정해보자. 인덱스를 걸어놔도,

 

select * from my_table where my_column != '1000' 으로 하면 full scan을 한다.

 

이 때 

select * from my_table where my_column > '1000' 이렇게 쿼리를 짜면 index scan을 하도록 할 수 있다.

 

물론 이 경우 유니크한 값들이 아니고 카디널리티가 그리 높지 않기 때문에 인덱스 효용성이 그렇게 높지는 않은 상황이긴 하다.

 

 

# 카디널리티가 높지 않은 칼럼에 인덱스 효과 누리기

예를 들어, my_table이 존재하고 nationality이 이런 분포를 가진다고 해보자.

 

대한민국 : 950만 rows

일본 : 3만 rows

가나 : 323 rows

태국 : 3 rows

...

 

이 테이블에서 국적이 대한민국인 row를 쿼링하는건 당연히 인덱스 효과를 볼 수 없다. (풀스캔과 동일)

 

단, 다른 국가들인 경우 인덱스 효과를 볼 수 있어 대한민국이 아닌 다른 국가들을 조회하는 쿼리가 많을 경우 인덱스를 적용해주는 것이 좋다.

반응형