어느 날 회사에서 NOT IN은 인덱스를 타냐는 내기가 걸려있었습니다.

Restart Programmer
2 min readDec 1, 2023

--

어느 날 보드판 처럼 쓰는 유리창에 NOT IN은 인덱스를 타냐는 내기가 걸려있었습니다. 그래서 결론은 NOT IN은 타지 않는다고 주장한 사람이 커피를 다 사게 되었습니다.

옆에서 어리둥절하게 Real MySQL 책을 보고 있는 저는 기억나지 않아서 다시 찾아보기 시작했습니다.

Photo by Andrew Neel on Unsplash

대부분의 상황에서는 NOT IN은 인덱스를 타지 않는다.

대부분 상황에서 타지 않습니다. 결론이 그랬습니다. 이는 커피를 산 동료도 인정하였습니다. 우선은 현실적으로 수많은 DBMS가 있기 때문에 상황에 따라서 다릅니다. 무조건 DBMS에 따라서 무조건 인덱스를 안 타는 DB 프로그램과 DB 엔진 차이가 있을겁니다. (MySQL에도 DB 엔진이 여러가지 있다는 점)

NOT IN이 인덱스를 사용하는 경우:

  1. 작은 결과 집합: NOT IN 절이 상대적으로 작은 결과 집합을 반환하는 경우, 인덱스를 사용할 수 있습니다. 이는 인덱스를 통해 더 효율적으로 필터링할 수 있기 때문입니다.
  2. 고유성 또는 낮은 카디널리티: 참조되는 컬럼에 대한 인덱스가 높은 고유성(낮은 중복)을 가지면, 인덱스를 통한 검색이 더 효율적일 수 있습니다.
  3. 적절한 인덱스: 쿼리에 사용된 컬럼에 적절한 인덱스가 있고, 데이터베이스 최적화기가 인덱스 스캔이 전체 테이블 스캔보다 비용이 적게 든다고 판단하는 경우에 인덱스를 사용할 수 있습니다.

NOT IN이 인덱스를 사용하지 않는 경우:

  1. 큰 결과 집합: NOT IN 절이 매우 큰 결과 집합을 반환하는 경우, 전체 테이블 스캔이 인덱스 스캔보다 더 효율적일 수 있습니다.
  2. 인덱스된 컬럼의 높은 중복도: 인덱스된 컬럼이 높은 중복도를 가지고 있으면, 인덱스 스캔이 전체 테이블 스캔만큼 비효율적일 수 있습니다.
  3. 쿼리 최적화기의 평가: SQL 쿼리 최적화기가 다양한 요인을 고려하여 전체 테이블 스캔이 인덱스 스캔보다 더 효율적이라고 판단하는 경우입니다.

다시 주위를 주자면, DB에 따라서 달라진다는 점이다.

--

--