카테고리 없음

[CS지식] 인덱스(Index)란 무엇인가?

sandbackend 2023. 1. 8. 23:36

인덱스

  • 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료구조

책에 비유

  • 데이터는 책의 내용
  • 데이터가 저장된 레코드의 주소는 인덱스 목록에 있는 페이지 번호

인덱스를 만드는 이유

  • DBMS(Database Management System)도 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져 오려면 시간이 오래 걸리기에, 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 두는 것
  • 인덱스는 항상 정렬된 상태를 유지하기에 원하는 값을 탐색하기엔 빠르지만 새로운 값을 추가, 삭제하는 경우에는 실행 속도가 느려짐.

→ 결론적으로, 인덱스는 데이터의 저장 성능을 희생하고 그 대신에 데이터의 읽기 속도를 높임

DBMS의 인덱스 관리

1. B+- Tree 인덱스 알고리즘 (Balanced)

  • 일반적으로 사용되는 인덱스 알고리즘
  • 트리구조의 우위성 → 탐색 시 단시간 내에 실행 가능

<B-tree, B+tree 참고 자료> https://zorba91.tistory.com/293

2. Hash 인덱스 알고리즘

  • B- Tree 만큼 범용적이지 않지만 고유의 특성과 용도를 지닌 인덱스
  • 칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘, 매우 빠른 검색을 지원
  • 비교검색에 최적화 돼 있지만 범위를 검색하거나 정렬된 결과를 가져오는 것으로 사용 불가능

저장공간

  • B-Tree : 노드
  • 해시 인덱스 : 버킷

탐색시간이 빠른 Hash가 인덱스로 적절하지 않은 이유

  • Hash Table에 저장되는 값들은 정렬되어 있지 않기 때문에
  • SQL 쿼리문에서 특정 범위의 값을 조회하는 경우

→ 특정 값보다 크거나 작은 값을 찾을 수 없다.

3. 클러스터 인덱스

  • 행 데이터를 해당 열로 정렬한 후에 루트 페이지를 만듬
  • 데이터 페이지는 리프 노드와 같음
  • 인덱스 자체의 리프 페이지가 곧 데이터
  • 데이터 입력, 수정, 삭제 시 항상 정렬 상태를 유지
  • 넌 클러스터 인덱스

<참고> https://junghn.tistory.com/entry/DB-클러스터-인덱스와-넌클러스터-인덱스-개념-총정리

4. 결합 인덱스 (Composite Index)

  • 인덱스를 생성 할 때 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것
  • 주로 SQL 문장에서 where절의 조건 컬럼이 2개 이상 and로 연결되어 함께 사용하는 경우 쓰임
//결합 인덱스 생성 구문 예시
CREATE INDEX idx_composite_index_1
ON Test(id, test_name, test_date)

인덱스는 잘못 사용하면 오히려 성능이 저하될 수 있다고 하였다

  • 인덱스를 생성하게 되면 INSERT, DELETE, UPDATE 쿼리문을 실행할 때 별도의 과정이 추가적으로 발생하기 때문이다.
  • INSERT의 경우 인덱스에 대한 데이터를 추가
  • DELETE의 경우 인덱스에 존재하는 값은 삭제하지 않고 사용하지 않는다는 표시

→ 즉 row의 수가 그대로 남는다.

  • UPDATE는 더 큰 문제가 발생 : 인덱스에 대한 데이터를 추가하는 것은 물론 변경 전 데이터도 사용하지 않음 으로 바꿔야 하므로 insert,delete의 문제가 모두 발생

다음과 같은 상황에서 사용하자

  • 규모가 작지 않은 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 칼럼
  • JOIN이나 WHERE 또는 ORDER BY가 자주 사용되는 컬럼
  • 데이터의 중복도가 낮은 컬럼

면접질문

  1. 인덱스란 무엇인지 설명과 다양한 자료구조중 예시 몇개 해주실 수 있을까요? 인덱스는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료구조로, 하나의 컬럼이나 여러개의 컬럼을 키로 갖고 키에 해당하는 주소값을 저장하는 색인입니다. 인덱스를 구현하기 위해서는 다양한 자료구조를 사용 할 수 있는데, 가장 대표적인 해시 테이블과 B- Tree가 있습니다.
  2. 인덱스를 생성해야 하는 경우는 언제인가요? where, join문에서 자주 사용되는 컬럼이나, 데이터의 중복도가 적은 컬럼 그리고 테이블의 규모가 작지 않을때 인덱스를 생성해야 합니다.