개발자로서 살아남기/데이터베이스

개발자가 반드시 알아야하는 데이터베이스 - MYSQL IS NULL 조건문 쿼리 최적화 하기

코드 살인마 2023. 10. 31. 21:50
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