null이 많으면 해당 컬럼의 카디널리티가 아주 작아진다.
이 두 상황에서는 어떻게 인덱스를 활용해야 할까 ?
물론 인덱스를 걸고 대충 쿼리 플랜 보면 인덱스를 타니까 type은 ref로 나온다.
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | 어쩌구 | null | ref | idx_어쩌구 | idx_어쩌구 | 303 | const | 2 | 100.0 | null |
대충 이렇게 보고 type이 ref네~ 하고 넘어가면 안된다.
해당 컬럼이 null이 많이 있는지를 봐야하는데,
실제로 내가 적용한 테이블에서 인덱스가 걸린 컬럼의 대부분의 값이 null이다.
MySQL can perform the same optimization on
col_name
IS NULL
that it can use forcol_name
=
constant_value
. For example, MySQL can use indexes and ranges to search forNULL
withIS NULL
.
mysql 문서에 나와있는 내용인데,
null로 인덱스에 들어간다.
그래서 내 상황에서는
column IS NULL 은 인덱스를 타게된다.
그리고 대부분의 값이 null인 컬럼이니, 이 경우 해당 인덱스는 거의 무용지물이다....
의사결정을 내려야 하는데,
WHERE column = const
이런식으로만 쿼리를 사용한다면 당연히 정상적으로 인덱스를 타게 되는데,
WHERE column IS NULL 이렇게 걸면 인덱스를 타지만 성능상 이점은 없게 된다.
그래서 고민이 되는 지점이 조회 성능상 인덱스를 해당 컬럼에 걸긴 해야하는데,,,
그냥 쿼리를 사용할때 IS NULL 이렇게 안쓰는걸 항상 염두에 두고 개발을 할지,,,
혹은 그냥 다른 컬럼에 인덱스를 걸어서 조금이라도 안전하게 갈지,,,
일단은 전자가 나아보인다 !!