NULL이 많은 컬럼에서 인덱스 사용하기

최진규·2023년 6월 9일
0

null이 많으면 해당 컬럼의 카디널리티가 아주 작아진다.

  • 쿼리 성능을 위해서 조회에 무조건 인덱스를 걸어야 하는 상황
  • 하지만 where로 검색할 컬럼의 대부분의 값이 null인 상황

이 두 상황에서는 어떻게 인덱스를 활용해야 할까 ?
물론 인덱스를 걸고 대충 쿼리 플랜 보면 인덱스를 타니까 type은 ref로 나온다.

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLE어쩌구nullrefidx_어쩌구idx_어쩌구303const2100.0null

대충 이렇게 보고 type이 ref네~ 하고 넘어가면 안된다.

해당 컬럼이 null이 많이 있는지를 봐야하는데,
실제로 내가 적용한 테이블에서 인덱스가 걸린 컬럼의 대부분의 값이 null이다.

MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value. For example, MySQL can use indexes and ranges to search for NULL with IS NULL.

mysql 문서에 나와있는 내용인데,
null로 인덱스에 들어간다.

그래서 내 상황에서는
column IS NULL 은 인덱스를 타게된다.
그리고 대부분의 값이 null인 컬럼이니, 이 경우 해당 인덱스는 거의 무용지물이다....

의사결정을 내려야 하는데,
WHERE column = const

이런식으로만 쿼리를 사용한다면 당연히 정상적으로 인덱스를 타게 되는데,
WHERE column IS NULL 이렇게 걸면 인덱스를 타지만 성능상 이점은 없게 된다.

그래서 고민이 되는 지점이 조회 성능상 인덱스를 해당 컬럼에 걸긴 해야하는데,,,
그냥 쿼리를 사용할때 IS NULL 이렇게 안쓰는걸 항상 염두에 두고 개발을 할지,,,
혹은 그냥 다른 컬럼에 인덱스를 걸어서 조금이라도 안전하게 갈지,,,

일단은 전자가 나아보인다 !!

profile
개발하는 개복치

0개의 댓글