인덱스 타입 종류

Park sang woo·2024년 7월 30일
1

CS스터디

목록 보기
12/25

📘 클러스터 인덱스

테이블의 데이터가 물리적으로 저장되는 순서를 결정하는 인덱스입니다.
즉 설정된 컬럼을 기준으로 데이터가 정렬되어 저장됩니다.
ex) 학생 ID가 1,2,3, ... 순서로 데이터가 저장.

클러스터 인덱스 생성하게 되면 데이터 페이지 전체가 다시 정렬됩니다.
하지만 이러한 정렬 특징 때문에, 이미 대용량의 데이터가 입력된 상태라면 클러스터 인덱스 생성은 심각한 시스템 부하를 줄 가능성이 있습니다.
대부분의 DB 시스템에서는 기본 키가 클러스터 인덱스로 자동 생성됩니다.
한 개의 테이블에 한 개씩만 만들 수 있고, 보조 인덱스보다 검색 속도는 더 빠르지만 입력/수정/삭제는 더 느립니다.

MySQL에서는 PRIMARY KEY 가 있다면 이것을 클러스터 인덱스, 없다면 UNIQUE하면서 NOT NULL인 컬럼을 클러스터로, 그것도 없다면 임의로 보이지 않는 컬럼을 만들어 클러스터 인덱스로 지정합니다.



📨 클러스터 인덱스 생성 시 페이지 변화

인덱싱을 하면 루트 페이지라는 것이 생성됩니다.
루트 페이지는 각 데이터 페이지의 첫 번째 데이터만 따와서 모아 매핑시키는 페이지입니다. 인덱스의 최상위 구조로, 각 리프 페이지의 첫 번째 데이터 값과 포인터를 저장합니다.
그리고 데이터 페이지는 자동 정렬이 됩니다.

  • 인덱스 페이지 : 추가적인 인덱스 정보를 포함. 데이터의 검색을 더 효율적으로 하기 위해 구성.
  • 리프 페이지 : 실제 데이터가 저장된 페이지. 이 페이지들은 DB의 행과 직접 연결되어 있음.
  • ex) 루트 페이지에서 특정 값을 찾아 해당 값이 있는 리프 페이지로 이동하면, 리프 페이지에서 실제 데이터를 조회 가능.



📨 클러스터 인덱스를 이용한 데이터 조회(단일)

만일 JKW만 찾고 싶다면 2 페이지만 찾으면 조회가 가능합니다.



📨 단일이 아닌 범위의 경우

여러 개의 데이터를 범위로 검색할 때 유저 아이디가 A ~ J인 사용자를 모두 검색해봅니다.
이때 역시 2페이지만 읽으면 됩니다. (정렬되어 있어 검색이 빠름.)



📨 클러스터 인덱스를 이용한 데이터 삽입...

FNT 데이터를 추가하면 주소 '1000'인 페이지에 공가닝 없어서 페이지 분할이 일어나 '2000' 페이지가 생겨버립니다.

정렬되어 있으면 오히려 삽입, 삭제를 할 때 페이지 분할이나 추가적인 정렬이 필요하게 되어 오히려 성능이 나빠집니다.






📘 보조 인덱스

데이터의 물리적 저장 순서와는 별개로 생성되는 인덱스입니다. 특정 컬럼에 대한 검색 성능을 향상시키기 위해 사용됩니다.

개념적으로는 후보키에만 부여할 수 있는 인덱스입니다.
보조 인덱스 생성 시 데이터 페이지는 그냥 둔 상태에서 별도의 페이지에 인덱스를 구성합니다.

별도의 페이지에서 인덱스를 구성하므로 클러스터와는 달리 자동 정렬을 하지 않습니다.

클러스터보다 검색 속도는 느리지만 데이터의 입력/수정/삭제는 더 빠릅니다.
여러 개 생성 가능하지만 맘대로 사용하면 오히려 성능이 저하됩니다.
각 데이터에 대해서 고유값(UNIQUE)들이 있는 목록에 생성할 수 있는 인덱스입니다.

📨 보조 인덱스 생성 시 페이지 변화

보조 인덱스 역시 루트 페이지가 생성됩니다.
하지만 데이터 페이지에 바로 연결시키지 않고 따로 리프 페이지를 만들어 매핑하고 정렬합니다.

그래서 추가 공간이 필요하여 인덱스를 남용하면 공간 낭비가 됩니다.
데이터 페이지는 변화를 주지 않습니다. 이게 클러스터와 달리 여러 개 생성이 가능한 이유입니다.



📨 보조 인덱스 데이터 조회 (단일)

JKW만 찾고 싶다면 3페이지를 찾아야 조회가 가능합니다.
만일 데이터가 억단위라면 클러스터와의 페이지 조회수가 엄청 차이가 납니다.



📨 단일이 아닌 범위

유저 아이디가 A ~ J인 사용자를 모두 검색.
5페이지를 읽어 검색.



📨 데이터 삽입

페이지 빈 곳에 데이터 넣고 리프 페이지에서 매핑만 하면 끝나므로 페이지 분할이 일어나지 않습니다.

삽입 측면에서는 클러스터보다 성능 이점이 있습니다.






📘 클러스터 + 보조 인덱스

인덱스가 없는 상태의 데이터 페이지

클러스터 인덱스 생성

ALTER TABLE 테이블명
ADD CONSTRAINT ~~ PRIMARY KEY (userID)

보조 인덱스 생성

ALTER TABLE mixedtbl
ADD CONSTRAINT ~~ UNIQUE (name);



📨 클러스터 + 보조 인덱스 조회

  • '임'재범을 조회
  • 보조 인덱스 페이지에서 매핑에 따라 가다가 임재범 LJB를 발견하면, 다시 클러스터 인덱스 루트 페이지로 가서 LJB로 검색하여 찾아들어감.
  • 총 4페이지를 읽음.

데이터 삽입에 있어 보조 인덱스 페이지의 부담을 줄이기 위해 사용합니다.

profile
일상의 인연에 감사하라. 기적은 의외로 가까운 곳에 있을지도 모른다.

0개의 댓글