커버링 인덱스

이진호·2023년 5월 20일
0

DB

목록 보기
6/6
post-thumbnail
post-custom-banner

커버링 인덱스

  • 쿼리를 충족하는데 필요한 모든 데이터를 갖는 인덱스
  • SELECT / WHERE / GROUP BY / ORDER BY 등에 활용되는 모든 컬럼이 인덱스의 구성 요소인 경우
  • 커버링 인덱스를 잘 쓰면 조회 성능을 상당 부분 높일 수 있다.

실행 계획 살펴보기

Workbench

Workbench

EXPLAIN

쿼리의 맨 앞에 EXPLAIN을 붙여 실행 아이콘보다 더 상세한 실행 계획을 확인할 수 있음.

EXPLAIN

id

SQL문이 실행되는 순서. 2개 행의 id가 같은 경우, 이는 조인된 것.

select_type

SELECT문의 유형

  • SIMPLE: 단순한 SELECT문
  • PRIMARY: 외부쿼리 또는 UNION이 포함되는 경우 1번째 SELECT문
  • SUBQUERY: SELECT / WHERE에 작성된 서브쿼리
  • DERIVED: FROM에 작성된 서브쿼리
  • UNION: UNION 또는 UNION ALL로 합쳐진 SELECT문

type

  • system: 0개 또는 1개의 데이터만 테이블에 존재하는 경우
  • const: 단 1개의 데이터만 조회하는 경우
  • eq_ref: 조인이 될 때, 드리븐 테이블의 PK 또는 고유 인덱스로 단 1개의 데이터만 조회하는 경우
  • ref: eq_ref와 같지만, 2개 이상의 데이터를 조회하는 경우
  • index: *Index Full Scan
  • range: *Index Range Scan
  • all: *Table Full Scan

Table Full Scan VS Index Range Scan VS Index Full Scan

key

옵티마이저가 실제로 선택한 인덱스.

rows

SQL문을 수행하기 위해 접근한 데이터의 모든 행 수.

extra

  • Distinct: 중복을 제거하는 경우
  • Using where: WHERE로 필터링한 경우
  • Using temporary: 데이터 중간 결과를 위해 임시 테이블을 생성한 경우 (보통 DISTINCT / GROUP BY / ORDER BY가 포함되면 임시 테이블 생성)
  • Using index: 커버링 인덱스를 사용한 경우
  • Using filesort: 데이터를 정렬한 경우

실행 계획의 extra에 Using index가 나타나면, 이는 커버링 인덱스를 활용한 것으로 해석할 수 있다.

Non-clustered Key와 Clustered Key

-대상제한
Non-clustered Key일반적인 인덱스테이블에 여러 개 생성 가능
Clustered Key(1) PK
(2) PK가 없을 땐, Unique Key
(3) PK가 없고 Unique Key도 없을 땐,
6 bytes의 Hidden Key 생성
테이블당 1개만 생성 가능

Non-clustered Key와 Clustered Key

Non-clustered Key는 age에, Clustered Key는 PK에 인덱스가 존재. Non-clustered Key는 age 순으로, Clustered Key는 PK 순으로 정렬.

Non-clustered Key엔 데이터 블록의 위치가 없음. 인덱스 조건에 부합하는 WHERE가 있더라도, SELECT 문에 인덱스에 포함되어 있는 컬럼 외의 다른 컬럼 값이 필요할 때는 Non-clustered Key에 있는 Clustered Key 값으로 데이터 블록을 찾는 과정이 필요해짐.

결국 커버링 인덱스는 이미지의 2.실제 데이터 접근 과정 없이, 인덱스에 존재하는 컬럼 값으로만 쿼리를 완성하는 것을 의미.

출처

post-custom-banner

0개의 댓글