어느 날 회사에서 NOT IN은 인덱스를 타냐는 내기가 걸려있었습니다.
2 min readDec 1, 2023
어느 날 보드판 처럼 쓰는 유리창에 NOT IN은 인덱스를 타냐는 내기가 걸려있었습니다. 그래서 결론은 NOT IN은 타지 않는다고 주장한 사람이 커피를 다 사게 되었습니다.
옆에서 어리둥절하게 Real MySQL 책을 보고 있는 저는 기억나지 않아서 다시 찾아보기 시작했습니다.
대부분의 상황에서는 NOT IN은 인덱스를 타지 않는다.
대부분 상황에서 타지 않습니다. 결론이 그랬습니다. 이는 커피를 산 동료도 인정하였습니다. 우선은 현실적으로 수많은 DBMS가 있기 때문에 상황에 따라서 다릅니다. 무조건 DBMS에 따라서 무조건 인덱스를 안 타는 DB 프로그램과 DB 엔진 차이가 있을겁니다. (MySQL에도 DB 엔진이 여러가지 있다는 점)
NOT IN
이 인덱스를 사용하는 경우:
- 작은 결과 집합:
NOT IN
절이 상대적으로 작은 결과 집합을 반환하는 경우, 인덱스를 사용할 수 있습니다. 이는 인덱스를 통해 더 효율적으로 필터링할 수 있기 때문입니다. - 고유성 또는 낮은 카디널리티: 참조되는 컬럼에 대한 인덱스가 높은 고유성(낮은 중복)을 가지면, 인덱스를 통한 검색이 더 효율적일 수 있습니다.
- 적절한 인덱스: 쿼리에 사용된 컬럼에 적절한 인덱스가 있고, 데이터베이스 최적화기가 인덱스 스캔이 전체 테이블 스캔보다 비용이 적게 든다고 판단하는 경우에 인덱스를 사용할 수 있습니다.
NOT IN
이 인덱스를 사용하지 않는 경우:
- 큰 결과 집합:
NOT IN
절이 매우 큰 결과 집합을 반환하는 경우, 전체 테이블 스캔이 인덱스 스캔보다 더 효율적일 수 있습니다. - 인덱스된 컬럼의 높은 중복도: 인덱스된 컬럼이 높은 중복도를 가지고 있으면, 인덱스 스캔이 전체 테이블 스캔만큼 비효율적일 수 있습니다.
- 쿼리 최적화기의 평가: SQL 쿼리 최적화기가 다양한 요인을 고려하여 전체 테이블 스캔이 인덱스 스캔보다 더 효율적이라고 판단하는 경우입니다.
다시 주위를 주자면, DB에 따라서 달라진다는 점이다.