728x90
개요
저번 글에서 스카우터를 활용하여 API의 성능을 측정할 수 있는 Summary 기능을 소개했었다.
해당 기능을 이용하여 slow 쿼리를 발견하였는데, 아래와 같았다.
select * from temp t where t.col is null
단순한 구문이라, 인덱스을 활용하여 쿼리 성능을 높이려고 했다.
근데, 문득 null
값을 허용하는 컬럼도 인덱스 성능의 효과가 있을까? 라는 의문이 들어, 관련 내용을 찾아보고, 실험도 직접 해봤다.
먼저 DB 환경에 따라 달라진다.
오라클
오라클은 인덱스에 null
값을 저장하지 않는다고 한다.
즉 아래와 같은 null
을 이용한 쿼리에 인덱스를 타지 않고, Full Scan을 진행한다.
select * from temp t where t.col is null
MYSQL
MYSQL은 null
자체를 하나의 값으로 저장을한다.
즉 다른 숫자들 처럼 null
을 저장하고 있으니, 당연히 인덱스도 적용된다.
실험
실험환경은 mysql-5.7.26 버전이다.
먼저 인덱스를 생성하지 않고, 해당 쿼리를 돌려보았다.
select * from temp t where t.col is null
explain 쿼리 결과는 다음과 같다.
Type이 ALL임으로, Full Scan 하는 것을 알 수 있다.
인덱스를 생성한다.
CREATE INDEX idx_col ON temp (col);
인덱스 생성후, 다시 위 쿼리를 실행한다.
Type이 ref로, 인덱스를 사용하는 것을 볼 수 있다.
결론
MYSQL에선 NULL 값을 저장함으로, is null
OR is not null
조건문에서도 인덱스 사용이 가능하다.
REFERENCE
'개발자로서 살아남기 > 데이터베이스' 카테고리의 다른 글
개발자가 반드시 알아야하는 데이터베이스 - MYSQL(InnoDB)에서 잠금된 데이터을 조회할 수 있는 이유 (1) | 2024.06.21 |
---|---|
개발자가 반드시 알아야하는 데이터베이스 - Master와 Slave에 쿼리 분산(Feat. MMM 구조) (0) | 2023.12.06 |
개발자가 반드시 알아야하는 데이터베이스 - NOSQL vs RDBMS 간단 정리 feat Redis (0) | 2023.07.25 |
개발자가 반드시 알아야하는 데이터베이스 - MYSQL에서 쿼리 최적화 하기 (1) - MYSQL Optimizer (0) | 2023.07.11 |