[CS] clustered Index, non-clustered Index

2025. 8. 27. 00:21·CS

Index

  • 데이터를 빠르게 검색하기 위한 자료구조
  • 대표 자료 구조: B+ Tree
    • 정렬된 상태 유지
    • 범위 검색에 효율적
  • 데이터가 정렬된 상태로 저장됩니다.
  • 검색, 삽입, 삭제 연산을 로그 시간에 수행이 가능합니다.
  • 트리 구조에서 leaf node 간 연결되기 때문에 범위 검색이 효율적입니다.
  • 인덱스를 추가하면, 쓰기 시점에 B+ tree 구조의 정렬된 상태의 데이터가 생성됩니다.
  • 이미 인덱스로 지정된 컬럼에 대해 정렬된 상태를 가지고 있기 때문에, 조회 시점에 전체 데이터를 정렬하고 필터링할 필요가 없다.
    • 따라서, 조회 쿼리를 빠르게 수행할 수 있습니다.

 

인덱스에 대한 기본 이해

MySQL의 기본 스토리지 엔진

  • innoDB
  • 스토리지 엔진(Storage Engine): DB에서 데이터 저장 및 관리 장치

InnoDB는 테이블마다 Clustered Index를 자동 생성

  • Primary Key를 기준으로 정렬된 Clustered Index
    • Primary Index(주 인덱스)라고도 불립니다.
    • 정확히는 규칙이 있지만, 일반적으로 Primary Key에 생성됩니다.
  • Clustered Index는 leaf node의 값으로 행 데이터(row data)를 가집니다.
mysql> explain select * from article where article_id = 167598086197714944;
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | article | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)
-> 자동으로 clustered Index 생성 (Primary Key를 이용한 조회)

 

 

인덱스의 종류

1. clustered Index (=Primary Key 인덱스, 클러스터형 인덱스)

clustered Index

  • InnoDB에서 기본으로 제공하는 인덱스 (Table당 1개만 생성)
  • Primary Key 기준으로 정렬된 인덱스
  • Leaf Node에 실제 데이터 row가 포함됨 → 빠른 데이터 접근이 가능합니다.
  • 테이블 데이터는 PK 순으로 저장되기 때문에 PRIMARY KEY 값이 변경되면 그 레코드의 물리적인 저장 위치가 바뀌어야 합니다. 
  • 테이블의 데이터가 정렬되어 있기에 속도면에서 우수한 성능을 보이지만, 데이터의 추가/수정/삭제 시 레코드를 매번 정렬해야 하기 때문에 추가/수정/삭제의 성능이 저하됩니다.

2. Non-clustered Index (Secondary Index = , 보조 인덱스)

non-clustered Index

  • Table 당 여러 개 생성이 가능합니다. 
  • Leaf Node에 실제 row가 없습니다.
    • 인덱스의 key 값과 데이터 행을 가리키는 포인터가 존재합니다. (인덱스 Key 값 + Primary Key 컬럼 값)
  • 특정 데이터를 access 하기 위해서는 secondary Index의 key 컬럼에서 Primary Key 값을 access 하고, 해당 값으로 Primary Key를 검색하여 원하는 데이터를 찾아가는 형태로 처리됩니다. (clustered Index와는 다르게 tree를 2번 타야 합니다.)
  • 테이블 데이터가 대용량으로 변경될 경우 secondary Index를 재구성하기 위해 많은 자원이 사용됩니다. 
  • 물리적으로 레코드를 정렬하지 않기 때문에 clustered index보다 속도면에서는 성능이 떨어지지만, 추가/수정/삭제의 성능은 뛰어납니다.
  • unique 제약조건을 설정한 컬럼에 대해 자동으로 Non-clustered Index를 생성합니다.
  1.  

 

3. id값을 주로 Primary Key로 두는 이유

  1. 각각의 테이블마다 PK로 id값을 가지고 있다 보니 일관성이 생깁니다. (다른 컬럼이 PK라면, 각각의 테이블의 PK를 알아내기 위해 테이블을 확인할 필요가 있습니다.)
  2. MySQL에서 PK를 설정하면 해당 값을 Index로 잡아 데이터를 B-tree 구조로 저장합니다.
    • 정수형 id는 정렬/저장에 최적화되어 있어서 검색, 범위조회, JOIN 모두 빠르게 동작합니다.
    • id 컬럼이 자동 증가하는 순서로 삽입되면, 트리의 균형을 유지하는데 있어서 추가적인 비용이 줄어들 수 있습니다. (O(logN) 보장)
  3. 대규모 데이터베이스에서 샤딩이나 파티셔닝과 같이 데이터를 쪼개고 나눌 때 유리합니다.
저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

[CS] Concurrency, Parallelism  (0) 2025.09.24
[CS] Call by Value, Call by Reference  (1) 2025.08.31
[Java] Functional Interface  (5) 2025.08.26
[CS] JVM Memory Structure  (6) 2025.08.15
[Tomcat] Tomcat의 핵심 컴포넌트와 동작 과정에 대해 분석해보자  (7) 2025.08.09
'CS' 카테고리의 다른 글
  • [CS] Concurrency, Parallelism
  • [CS] Call by Value, Call by Reference
  • [Java] Functional Interface
  • [CS] JVM Memory Structure
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (400)
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (29)
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (100)
        • Effective Java (9)
        • Java Concept (21)
        • Spring (61)
        • Design Pattern (4)
      • Python (2)
      • Vscode (1)
      • DevOps (44)
        • AWS (27)
        • Git (7)
        • Docker (7)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (3)
        • MatJido (3)
      • 기타 (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 소개
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    Wi-Fi
    일본여행
    docker
    너비 우선 탐색
    Effective Java
    sqld
    springboot
    BFS
    dfs
    컴퓨터구조
    이펙티브 자바
    정보처리기사 실기
    Spring
    정보처리기사 필기
    정보처리기사
    메타코딩
    백트래킹
    dp
    AWS
    다이나믹 프로그래밍
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
[CS] clustered Index, non-clustered Index
상단으로

티스토리툴바