Full Scan : 테이블에 존재하는 모든 데이터를 읽어 가면서 조건에 맞으면 결과로서 추출하고 조건에 맞지 않으면 버리는 방식.
Index Scan : 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 방식. 예를 들어 Index Range Scan의 경우 인덱스를 따져 필요한 범위만을 스캔하는 방식이다.

 

인덱스를 타지 않는 Where 절

  • like '%~'와 같이 %로 시작하는 단어일 때 Full Scan을 하게 된다. 
    • 컬럼 A에 인덱스를 생성하면 컬럼 A는 자동으로 정렬되게 된다. 따라서 앞부분부터 검색해야 하는데, 앞 부분이 %로 되어있으면 인덱스를 사용할 수 없으므로 결국 Full Scan을 한다.
    • 이 경우의 해결법은 따로 없으므로 최대한 다른 컬럼의 조건을 활용하여 충분히 필터링한 후 like 연산이 수행되도록 데이터를 설계해야 한다.
  • 한 조건에 대해서만 인덱스를 생성하고 or 연산자를 사용하면 Full Scan을 하게 된다.
    • 앞 조건이 어떻든 뒷 조건도 확인을 해야하기 때문에 Full Scan + Index Scan보단 Full Scan이 낫기 때문에 결국 Full Scan을 진행하게 된다.
    • 두 컬럼에 인덱스를 생성하여 or 연산자를 사용하면 될 때가 있다. 쿼리문 마다 다를 수 있으므로 실행계획을 확인해보자.

cf) 인덱스를 무분별하게 생성하면 조회의 경우 성능은 좋을 수 있어도 삽입, 삭제시에 인덱스에 변형이 일어나면 오히려 성능이 떨어질 수 있다. 팁으로는 조회할 레코드의 건수가 전체 레코드 수의 20~25% 넘기면 인덱스를 사용 안하는게 효율적이다.

 

  • 특정 컬럼에 대해 인덱스가 있음에도 부정문을 사용할 경우 인덱스를 타지 않을 수도 있다. 예를 들어 where column!=0일 때 인덱스를 타지 않는다면 where column>0 and column<0 을 사용하자

 

핵심 : 인덱스를 타는지에 대해서는 DBMS마다 천차만별이므로 성능이 안 좋다고 느껴지는 것에 대해 실행 계획을 하나 하나 따져 보자.

'Database > MySQL' 카테고리의 다른 글

WITH 구문  (0) 2025.02.14
where 절 서브쿼리 실행 방식  (0) 2025.02.12
MYSQL - DATE TYPE 연산  (0) 2024.06.09
MYSQL - 반올림, 버림  (1) 2024.06.07
MYSQL - NULL 처리  (0) 2024.06.07

+ Recent posts