3 minute read

Mention : 인덱스(색인)📚를 쓰면 검색 성능 개선의 효과가 굉장하다!

인덱스

  • 사전적 정의 - 색인
  • 원하는 값을 빠르게 찾는다!
    • 특정 기준으로 정렬되어 있다면 빠르게 검색할 수 있을것이다.
    • ex) SELECT * FROM member WHERE email = ‘soonable@gmail.com’ 인덱스가 적용된 대상을 WHERE 절을 통해 검색
  • 데이터베이스 테이블에 대한 검색 성능을 향상시키는 자료 구조이며 WHERE 절 등을 통해 활용된다.
    • 인덱스는 항상 최신의 정렬상태를 유지
    • 인덱스도 하나의 데이터베이스 객체
    • 데이터베이스 크기의 약 10% 정도의 저장공간 필요

인덱스 알고리즘

  • 페이지
    • 데이터가 저장되는 단위 (16 kbyte)

Full table scan

https://t1.daumcdn.net/cfile/tistory/999D97455FD318D628

  • 순차적으로 접근
  • 접근 비용 감소
    • 적용 가능한 인덱스가 없는 경우
    • 인덱스 처리 범위가 넓은 경우
    • 크기가 작은 테이블에 엑세스하는 경우

B-tree

  • Binary Search Tree (이진 탐색 트리)
    • 이진탐색
    • 연결리스트
      • 균형 있는 경우 O(log n)
      • 균형 없는 경우 O(n) 최악의 경우

    https://www.gatevidyalay.com/wp-content/uploads/2018/07/Binary-Search-Tree-Example.png

  • B-tree(Balanced-Tree)

    https://velog.velcdn.com/images%2Femplam27%2Fpost%2Fddbae2c9-da94-457d-bad8-77ff6791255b%2FB%ED%8A%B8%EB%A6%AC%20%EA%B8%B0%EB%B3%B8%20%ED%98%95%ED%83%9C.png

    • 트리 높이가 같음
    • 자식 노드를 2개 이상 가질 수 있음
    • 기본 데이터베이스 인덱스 구조
      • 루트 페이지 (자식페이지의 정보)
      • 브랜치 페이지 (자식 페이지의 정보)
      • 리프 페이지 (leaf page)
        • 실제 데이터 페이지 (클러스터링 인덱스)
        • 실제 데이터의 주소 페이지(논-클러스터링 인덱스)
  • INSERT?
    • 페이지 분할
      • 페이지에 새로운 데이터를 추가할 여유공간이 없어 페이지에 변화가 발생
      • DB가 느려지고 성능에 영향을 준다.
  • DELETE?
    • 인덱스의 데이터를 실제로 지우지 않고 사용안함 표시를 한다.
  • UPDATE?
    • DELETE (기존 값 사용안함 표시)
    • INSERT (변경된 값 삽입)
  • UPDATE와 DELETE의 경우 사용하지 않는 인덱스가 적용되었다면 불필요한 처리량 증가, 사용안함 표시로 페이지 낭비 및 인덱스 조각화 심해짐
    • 성능이 저하된다.

인덱스 종류

  • 클러스터 (Cluster)
    • 무리, 군집
    • 무리를 이루다

클러스터링 인덱스

  • 실제 데이터와 무리를 이룸
  • 실제 데이터와 같은 무리의 인덱스
    • ex) 사전
  • pk → 클러스터링 인덱스
    • ex) ALTER TABLE member ADD CONSTRAINT pk_id PRIMARY KEY(id);
    • ex) ALTER TABLE member MODIFY COLUMN id int NOT NULL; ALTER TABLE member ADD CONSTRAINT nuq_id UNIQUE(id);
  • 실제 데이터 자체가 정렬
  • 테이블당 1개만 존재 가능
  • 리프 페이지데이터 페이지
  • 아래의 제약조건 시 자동 생성
    • primary key(우선순위)

논-클러스터링 인덱스

  • 실제 데이터와 무리를 이루지 않음
  • 실제 데이터와 다른 무리의 별도의 인덱스
    • ex) 책의 색인
    • 루트 페이지 → 별도의 인덱스 페이지 추가 (B-tree) → 리프페이지
    • 리프페이지의 실제 데이터 페이지의 데이터는 변경되지 않음
  • unique → 논-클러스터링 인덱스
    • ex) ALTER TABLE member ADD CONSTRAINT unq_name UNIQUE(name);
    • ex) CREATE UNIQUE INDEX unq_idx_name ON member(name);
    • ex) CREATE INDEX idx_name
  • 실제 데이터 페이지는 그대로
  • 별도의 인덱스 페이지 생성 → 추가 공간 필요
  • 테이블당 여러 개 존재
  • 리프 페이지에 실제 데이터 페이지 주소를 담고 있음
  • unique 제약조건 적용시 자동 생성
  • 직접 index 생성시 논-클러스터링 인덱스 생성

다수의 인덱스 (클러스터링 + 논-클러스터링 인덱스)

  • ex) id 컬럼에 클러스터링 인덱스 + name 컬럼에 논-클러스터링 인덱스
    • ex) name을 검색하는 경우 name 인덱스 페이지에서 탐색 후 (논-클러스터링)
      • 리프 페이지에 클러스터링 인덱스가 적용된 컬럼의 실제 값 (id)
    • 해당 id를 클러스터링 인덱스 페이지에서 탐색하게 된다.

인덱스 적용기준

  • 카디널리티 (Cardinality)
    • the number of elements in a set or group
  • 어떤 컬럼에 인덱스를 적용해야 할까?
    • 카디널리티(그룸 내 요소의 개수) 가 높은 것
      • 중복도가 낮은 것
    • WHERE, JOIN, ORDER BY 절에 자주 사용되는 컬럼
      • 인덱스는 추가 공간이 필요로 된다.
      • 조건 절이 없다면 인덱스가 사용되지 않는다.
    • INSERT, UPDATE, DELETE 가 자주 발생하지 않는 컬럼
    • 규모가 작지 않은 테이블
  • 인덱스 사용시 주의사항
    • 잘 활용되지 않는 인덱스는 과감히 제거
      • WHERE 절에 사용되더라도 자주 사용해야 가치가 있다.
      • 불필요한 인덱스로 성능저하가 발생할 수 있다.
    • 데이터 중복도가 높은 컬럼은 인덱스 효과가 적다 (카디널리티가 낮은 것)
    • 자주 사용되더라도 INSERT, UPDATE, DELETE 가 자주 일어나는지 고려해야 한다.
      • 일반적인 웹 서비스와 같은 온라인 트랜잭션 환경에서 쓰기와 읽기 비율은 2:8 or 1:9
      • 조금 느린 쓰기를 감수하고 빠른 읽기를 선택하는 것도 하나의 방법

Summary

  • 인덱스의 사전적 정의는 색인으로 원하는 값을 빠르게 찾기 위해서 특정 기준으로 정렬해논것 입니다. 책의 뒷면의 색인에서 원하는 키워드를 찾아 해당 내용으로 빠르게 가듯이 데이터베이스 또한 마찬가지입니다. 데이터베이스에서 인덱스란 테이블에 대한 검색 성능을 향상시키는 자료구조이며 WHERE 절 등을 통해 활용됩니다.
  • 동작 원리는 database buffer cache 에 데이터가 있는지 확인하고 해당 정보가 없다면 디스크 파일에서 조건에 부합하는 데이터를 찾아 database buffer cache 에 가져온 뒤 사용자에게 보여줍니다. 이때 이 때 인덱스가 없으면 10만개를 전부 database buffer cache 로 복사한 후 풀스캔으로 찾게 되는데, 인덱스가 있다면 조건에 따라 인덱스의 키로 생성 되어 있는지 확인한 뒤 인덱스에 조건에 부합하는 정보가 어떤 ROWID(주소)를 가지고 있는지 확인 후 ROWID에 있는 블럭을 찾아가 해당 블럭만 버퍼 캐시에 복사합니다.
  • 인덱스 알고리즘으로는 순차적으로 접근하는 Full table scan 과 이진 탐색 트리인 B-tree 가 있습니다. B-tree가 기본 데이터베이스의 인덱스 구조입니다.

Reference 📚

https://www.youtube.com/watch?v=edpYzFgHbqs&t=342s

Leave a comment