[ MySQL ] 인덱스 ( Index )

Wooju Kang ·2025년 5월 8일

[ RDMBS ] MySQL

목록 보기
8/9
post-thumbnail

GIF 출처 : https://logpresso.store/ko/apps/mysql

🖥 Contents


1 ) 인덱스 ( Index ) 란?

2 ) 클러스터형 인덱스 ( Clusterd Index )

3 ) 비클러스터형 인덱스 ( Non - Clusterd Index )




1 ) 인덱스 ( Index )


  • 인덱스 ( Index ) 란?

    : 인덱스란 필요한 데이터를 바로 찾을 수 있도록 참고하는 데이터를 의미한다.

    이를 통해 수많은 데이터 중 특정 조건을 만족하는 데이터를 조회할 때마다 모든 데이터를 일일이 검사해서 필요한 데이터를 찾아야 하는 비용을 감소시킬 수 있다.

    • 장점

    ① 원하는 데이터를 빠르게 검색할 수 있음

    ② 데이터 조회 뿐만 아니라 조인 시에도 빠른 성능을 얻을 수 있음

    • 단점

    ① 인덱스를 별도로 저장하는 인덱스 페이지를 구성하기 위해 추가 공간이 필요

    ② 데이터를 수정할 때 연결된 정보도 함께 수정해야하는 경우 추가 비용이 발생

    • 종류

    ( 1 ) 클러스터형 인덱스 ( Clusterd Index )

    ( 2 ) 비클러스터형 인덱스 ( Non - Clustered Index )




2 ) 클러스터형 인덱스 ( Clusterd Index )


  • 클러스터형 인덱스 ( Clusterd Index ) 란?

    : 사전식으로 데이터가 정렬되어있고 인덱스 안에 데이터가 들어 있어 빠르게 데이터를 조회할 수 있는 방식을 의미한다. 클러스터형 인덱스는 인덱스를 기준으로 데이터가 자동으로 정렬되어 저장되며 , 인덱스의 리프 페이지에는 데이터가 존재한다.

    이는 인덱스 자체가 물리적 순서를 결정함을 의미한다.

    • 특징

    ① 테이블 당 1개만 존재할 수 있다.

    ② 기본키로 지정된 열은 클러스터형 인덱스가 자동으로 생성된다.

    ③ 실제 저장된 데이터와 같은 순서로 물리적인 데이터 페이지 구조를 갖는다.

    ④ 클러스터형 인덱스를 기준으로 데이터가 자동으로 정렬된다.

    ⑤ 기본키를 변경하면 클러스터형 인덱스가 변경되므로 변경된 기본키를 기준으로 데이터가 다시 정렬된다.

    출처 : https://www.stratascratch.com/blog/clustered-vs-non-clustered-indexes-in-sql/



    • 생성 및 삭제

    먼저 테이블을 생성후에 col_1 열에 무작위로 순서대로 번호를 삽입한다. 이 후에 col_1열에 기본키를 지정한 후 SELECT 문을 사용하면 기본키를 기준으로 정렬된 것을 확인할 수 있다.
    만약 기본키를 다른열로 변경할 경우 col_1 기준이 아닌 다른 Column 기준으로 변경된다. 또한 2개 이상 합한 인덱스를 생성할 수 있는데 이를 복합키 ( Composite Key ) 라고 한다.




3 ) 비클러스터형 인덱스 ( Non - Clustered Index )


  • 비클러스터형 인덱스 ( Non - Clustered Index ) 란?

    : 비클러스터형 인덱스란 실제 데이터가 위치한 주소 정보로 인덱스 페이지를 별도로 생성하며 데이터를 정렬하지 않는 방식을 의미한다. 따라서 테이블당 비클러스터형 인덱스는 여러개 생성할 수 있다.

    리프 페이지에는 실제 데이터의 주소인 RID(Row Identifier) 값을 가지고 있으며 루트와 논리프 노드는 인덱스 정보를 가지고 있다.

    비클러스터형 인덱스는 리프 페이지의 주소를 참조하여 실제 데이터 페이지로 가서 데이터의 정보를 읽는 방식이다.


    • 특징

    ① 한 테이블에 여러 개 설정할 수 있다.

    UNIQUE 명령어로 고유 열을 지정할 때 비클러스터형 인덱스 ( 보조 인덱스 ) 가 자동으로 생성된다.

    ③ 실제 저장된 데이터와 다른 물리적인 데이터 페이지 구조를 갖는다.

    ④ 클러스터형 인덱스와 달리 데이터를 정렬하지 않는다.

    CREATE INDEX 문으로 비클러스터형 인덱스 ( 보조 인덱스 ) 를 직접 생성할 수 있다.

    출처 : https://www.geeksforgeeks.org/difference-between-clustered-and-non-clustered-index/



    • 생성 및 삭제

    먼저 클러스터형 인덱스 예시와 마찬가지로 테이블 생성후 데이터를 무작위로 생성하여 입력한다.

    이후 col_1 열을 기본키로 지정한다.

    그 다음 col_2을 기준으로 조회할 때 , PRIMARY KEY를 조회하는 것이 아닌 col_2값을 기준으로 조회하면 비클러스터형 인덱스를 참조하여 간접 조회를 실행하게 된다.

    해당 쿼리 실행과정은 다음과 같다.

    1. col_3 = 'turtle' 조건 → 비클러스터 인덱스 col_3 탐색
    2. 해당 인덱스 리프 노드에서 → col_1 = 1 을 얻는다.
    3. 해당 PK값으로 클러스터형 인덱스에 접근해서 전체 행을 가져온다.

    PK의 경우 자동적으로 클러스터형 인덱스가 되고 PK를 제외한 나머지 Column에 대해서는 인덱스 지정 키워드를 통해 인덱스를 지정할 수 있다. 해당 키워드를 사용할 경우 B+ Tree에서 인덱스에 대한 노드가 생성된다.

    마지막으로 클러스터형 인덱스와 마찬가지로 DROP 키워드를 통해 비클러스터형 인덱스를 삭제할 수 있다.


profile
배겐드 📡

0개의 댓글