쏭의 개발 블로그

Index Scan 인덱스 스캔 본문

DB

Index Scan 인덱스 스캔

songu1 2025. 3. 23. 20:27

 

 

Index Scan이란?

Index Scan은 테이블을 조회할 때 ,인덱스를 활용하여 데이터를 검색하는 방식이다.

 

Full Table Scan (Sequential Scan)

테이블에 존재하는 모든 데이터를 읽어가면서 조건에 맞으면 결과로 추출하고, 조건에 맞지 않으면 버리는 방식이다.

인덱스를 거치지 않고 테이블 데이터에 직행하여 처음부터 끝까지 스캔하는 방식으로, 테이블의 모든 레코드를 순차적으로 조회한다. 디스크 I/O 비용이 많이 발생하며 대량의 데이터를 처리할 때는 시스템 성능에 부정적인 영향을 미칠 수 있다.

대량의 데이터에 접근할 때 Full Table Scan을 활용하면 인덱스를 통한 랜덤 엑세스가 발생하지 않아 이점이 있다.

 

Full Table Scan의 사용

Full Table Scan은 다음 상황에서 사용한다.

  • 대량의 데이터를 한번에 처리를 해야할 때
  • 인덱스를 사용하여 데이터를 가져오는 것보다 테이블 전체를 스캔하는 것이 빠른 경우
  • 테이블의 모든 데이터를 가져와야하는 경우

 

Index Scan

인덱스를 구성하는 컬럼의 값을 기반으로 데이터를 추출하는 엑세스 기법이다. 인덱스를 활용하여 특정 데이터만 빠르게 검색할 수 있다. 인덱스는 DB 테이블에서 특정 열에 대한 정보를 가지고 있기 때문에 해당 열을 사용하여 검색할 경우 인덱스 스캔을 사용 가능하다.

 

 

Index Scan의 종류

(1) Index Full Scan 인덱스 전체 스캔

인덱스의 모든 데이터를 읽어오는 방법이다. 테이블에 접근하지 않고 인덱스 내의 컬럼만 참조하여 처음부터 끝까지 스캔하여 데이터에 접근한다. 테이블의 일부 데이터를 사용하므로, 테이블 풀 스캔보다 유리하다. 데이터 검색을 위한 최적의 인덱스가 없을 때 차선으로 선택하며, 마땅한 인덱스가 없을 때 조건절에서 필터 후 데이터양이 소량이면 index full scan 후 필터된 데이터를 대상으로 테이블에 엑세스하는 것이 효율적이다.

SELECT * FROM {테이블명} WHERE {인덱스 컬럼}

 

인덱스의 크기가 작은 경우 빠른 검색이 가능하다는 장점이 있다. 반대로 단점은 테이블의 크기가 큰 경우 전체 테이블 스캔보다 느릴 수 있다는 점이다. 데이터베이스의 성능에 영향을 미칠 수 있으며 인덱스를 효율적으로 사용하여 인덱스 전체 스캔이 발생하지 않도록 해야한다.

 

Index Full Scan 의 사용

  • 인덱스를 사용하지 않고 전체 테이블을 검색해야할 때 발생
  • 선택성이 낮아 일부 레코드만 가져올 때 발생

여기서 선택성은 인덱스 값이 얼마나 유일한지에 대한 지표이다. 예를 들어 성별같은 것은 유일성이 낮아 선택성이 낮고, 전화번호는 유일성이 높어 선택성이 높다.

 

(2) Index Range Scan

인덱스의 일부 데이터만 읽어오는 방식으로, 인덱스의 범위를 지정하여 빠른 검색이 가능하다. BETWEEN, LIKE, < 등을 사용했을 때, 인덱스 범위를 기준으로 스캔하고 스캔 결과를 토대로 테이블에 접근한다. 특정 범위 내의 레코드만 읽어들이므로 비용이 적게 들며, 선택성이 낮은 경우 전체 스캔이 발생할 수 있다.  index값이 unique가 아니라 중복을 허용할 때, 2번 이상 범위를 탐색하는 방법이다. 성능은 인덱스 스캔 범위, 테이블 엑세스 획수를 얼마나 줄일 수 있느냐로 결정된다.

SELECT * FROM {테이블명} WHERE {인덱스 컬럼} BETWEEN {범위 시작값} AND {범위 종료값}

 

 

장점은 인덱스의 크기와 테이블의 크기에 관계없이 빠른 검색이 가능하다는 것이고, 단점은 검색 범위가 넓을 경우 느릴 수 있다는 것이다.

 

 Index Range Scan의 사용

  • WHERE절에서 범위 검색
  • ORDER 절에서 정렬
  • JOIN 연산

 

(3) Index Unique Scan

인덱스의 유일한 값을 검색하는 방법이다. WHERE문에 =을 사용했을 때나 기본키, 고유 인덱스로 테이블에 접근하는 방식이다. unique index라 하더라도 범위 검색 조건(BETWEEN, 부등호, LIKE로 검색할때는 INDEX RANGE SCAN으로 처리된다. 값이 하나만 존재하는 것을 보장하며, 하나의 값만 읽어들여 비용이 가장 적게 들기 때문에 인덱스를 사용하는 방식 중 가장 효율적인 스캔 방식이라고 할 수 있다.

SELECT * FROM {테이블명} WHERE {인덱스 컬럼} = {검색값}

 

장점은 인덱스의 크기와 테이블의 크기에 관계없이 빠른 검색 가능하다는 점, 단점은 인덱스 컬럼이 유일한 값을 가지고 있을 때만 사용 가능하다는 점이다.

 

Index Unique Scan의 사용

  • PRIMARY KEY나 UNIQUE 인덱스를 사용하여 조회
  • 인덱스에서 단일 값을 검색할 때

 

(4) Index Loose Scan (Index Skip Scan)

인덱스의 일부 데이터만 읽어오는 방식으로, 인덱스의 범위를 지정하지 않고 검색을 수행한다. 인덱스에서 필요한 부분만 선택하여 스캔한다. 인덱스 범위 스캔과 비슷하게 특정 인덱스 범위만 스캔하지만, 필요없는 인덱스 키 값을 건너 뛰고 다음으로 넘어가 검색을 수행한다. WHERE 조건문 기준으로 필요한 데이터와 불필요한 데이터를 구분한 뒤 불필요한 인덱스 키는 무시한다.

SELECT * FROM {테이블명} WHERE {인덱스 컬럼} LIKE '%{검색어}%'

 

장점은 인덱스의 크기와 테이블의 크기에 관계없이 빠른 검색 가능하다는 점, 단점은 정확도가 떨어질 수 있다는 부분이다.

 

Index Loose Scan의 사용

  • WHERE절에 LIKE 키워드로 특정 문자열 조회
  • GROUP BY, MAX, MIN 함수 포함

 

(5) Index Merge Scan

여러 개의 인덱스를 병합하여 검색하는 방법이다. WHERE문의 조건 열이 서로 다른 인덱스에 존재할 때 사용된다. 각 인덱스를 병합하는데 시간이 걸리기 때문에 전체적인 속도가 느릴 수 있으나 각각의 인덱스를 사용하는 것보다 효율적이다.

SELECT *
FROM {테이블명}
WHERE {인덱스 컬럼1} = {검색값1}
AND {인덱스 컬럼2} = {검색값2};

 

장점은 복잡한 검색 조건을 처리할 수 있다는 것이며, 단점은 인덱스의 크기가 작은 경우에만 유용하고 병합에 시간이 걸릴 수 있다는 점이다.

 

Index Merge Scan 의 사용

  • OR 조건이 포함된 쿼리에서 각각의 조건에 해당하는 인덱스를 사용
  • UNION ALL 연산자를 사용하는 경우

 


참고자료

https://velog.io/@jooh95/DB-Scan-종류-정리

https://adjh54.tistory.com/163

https://velog.io/@tothek/인덱스-기본-INDEX-SCAN종류