MySQL 인덱스(클러스터드, 세컨더리, 커버링) 가볍게 이해하기

2023. 7. 17. 10:39·Database & Data/MySQL
728x90
SMALL

개념적

  1. 클러스터드 인덱스(Clustered Index): 라이브러리에서 책을 찾는 것을 생각해 보자.책들이 그들의 주요 키인 ISBN 번호 순서대로 정렬되어 있다고 가정한다. 이 경우, ISBN 번호가 클러스터드 인덱스와 같다. 특정 ISBN을 가진 책을 찾으려면, 책장을 탐색하여 정확한 위치를 찾는다. 이러한 방식으로 책은 ISBN 번호에 따라 물리적으로 정렬된다.
  2. 세컨더리 인덱스(Secondary Index): 이제 책의 제목으로 책을 찾으려고 한다고 상상해 보자. 이 경우, 책의 제목은 보조 인덱스와 같다. 책 제목에 따라 정렬된 카드 카탈로그(세컨더리 인덱스)를 통해 먼저 책의 ISBN을 찾는다. 그다음, 이 ISBN을 사용하여 책장에서 실제 책을 찾는다.
  3. 커버링 인덱스(Covering Index): 이제, 당신이 라이브러리에서 '고양이'에 관한 책들의 제목과 저자만 알고 싶다고 가정해 보자. 이 정보가 카드 카탈로그(인덱스)에 모두 있으면, 실제 책을 찾기 위해 책장을 찾아볼 필요가 없다. 이 경우, 카드 카탈로그는 모든 필요한 정보를 '커버'하므로, 이것을 커버링 인덱스라고 한다. 여기서는 실제 책(데이터)에 액세스 하지 않고도 필요한 정보를 모두 가져올 수 있다.

기술적

  1. 클러스터드 인덱스(Clustered Index): 이 인덱스는 행의 물리적인 순서를 기본 키의 순서와 일치시킨다. 이러한 방식은 주요 키에 따른 데이터의 물리적인 정렬을 나타낸다. InnoDB의 경우, 기본 키가 클러스터드 인덱스로 사용된다. 이 클러스터드 인덱스의 B+ 트리의 리프 노드에는 행의 실제 데이터가 모두 저장된다.
  2. 세컨더리 인덱스(Secondary Index): 이 인덱스는 특정 컬럼에 적용되는 추가적인 인덱스이다. 세컨더리 인덱스의 B+ 트리의 리프 노드에는 해당 컬럼의 값과 해당 행의 기본 키가 함께 저장된다. 이 기본 키는 해당 행의 실제 데이터를 찾기 위해 클러스터드 인덱스를 검색하는 데 사용된다. 세컨더리 인덱스를 사용해 데이터를 검색할 때는 두 단계를 거친다. 먼저, 세컨더리 인덱스의 B+ 트리를 따라 해당 키 값을 찾는다. 그런 다음, 찾은 기본 키로 클러스터드 인덱스의 B+ 트리를 검색해 실제 행 데이터를 찾는다. 이것을 종종 "인덱스 검색 후 주 키 검색"이라고 부른다고 한다.
  3. 커버링 인덱스(Covering Index): 이는 특정 쿼리의 모든 컬럼이 세컨더리 인덱스에 포함되어 있는 경우를 가리킨다. 이 경우, 쿼리는 세컨더리 인덱스만으로 데이터를 찾을 수 있으므로, 주 키로 클러스터드 인덱스를 검색할 필요가 없다. 이로 인해 성능 향상이 이루어진다.

클러스터드 인덱스 = Primary Key
세컨더리 인덱스 = 특정 컬럼에 생성한 인덱스
커버링 인덱스 = 세컨더리 인덱스만으로 데이터를 찾기 때문에 클러스터드 인덱스를 찾지 않고 커버가 가능한 인덱스

Flow 종류

  1. 클러스터드 인덱스로만 데이터를 찾는다.(Primary Key)
  2. 세컨더리 인덱스로 값을 찾은 이후에 클러스터드 인덱스로 데이터를 찾는다.(Index → Primary Key)
  3. 세컨더리 인덱스로만 데이터를 찾는다.(Index)
728x90
SMALL
저작자표시 비영리 변경금지

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

MySQL --login-path 옵션 이해하기  (0) 2023.07.27
MySQL SQL 쿼리 성능 향상: CASE WHEN vs UNION  (0) 2023.07.26
MySQL Bulk Insert(LOAD DATA INFILE)  (0) 2023.07.07
MySQL 기본 PATH 설정하기  (0) 2023.07.06
MySQL 랭킹 함수 모음  (0) 2023.07.03
'Database & Data/MySQL' 카테고리의 다른 글
  • MySQL --login-path 옵션 이해하기
  • MySQL SQL 쿼리 성능 향상: CASE WHEN vs UNION
  • MySQL Bulk Insert(LOAD DATA INFILE)
  • MySQL 기본 PATH 설정하기
동석해요
동석해요
공부하고 싶은게 많은, 사소한 IT 지식들 공유
    250x250
  • 동석해요
    개발로 자기계발
    동석해요
  • 전체
    오늘
    어제
    • 분류 전체보기 (226)
      • Develop (126)
        • 기초지식 (12)
        • FastAPI (102)
        • Django (11)
      • Database & Data (62)
        • 기초지식 (16)
        • MySQL (29)
        • PostgreSQL (8)
        • 데이터 분석 (9)
      • 인공지능 (11)
        • PyTorch (9)
      • Cloud (8)
        • AWS (4)
        • GCP (2)
      • 버그처리 (14)
      • 회고 & 일상 (5)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
동석해요
MySQL 인덱스(클러스터드, 세컨더리, 커버링) 가볍게 이해하기
상단으로

티스토리툴바