묠니르묘묘
꾸준히 성장하는 개발자스토리
묠니르묘묘
전체 방문자
오늘
어제
  • 분류 전체보기 (188)
    • 프로그래밍 (48)
      • 디자인패턴 (4)
      • 예외,에러 (4)
      • Java (29)
      • Kotlin (3)
      • React.js (4)
      • JavaScript (2)
      • Apache Kafka (2)
    • Spring (49)
      • Spring (21)
      • Spring Cloud (3)
      • JPA (25)
    • 코딩테스트 (31)
      • 알고리즘 (5)
      • Java - 백준 (26)
      • Java - 프로그래머스 (0)
    • AWS (7)
    • 데이터베이스 (6)
    • 개발 etc (23)
    • 도서 (5)
    • 회고록 (4)
    • 데브코스-데이터엔지니어링 (15)

인기 글

최근 글

hELLO · Designed By 정상우.
묠니르묘묘

꾸준히 성장하는 개발자스토리

데이터베이스

인덱스(index)란?

2023. 3. 23. 14:04

1. 인덱스란?

  • DB 테이블에 대한 검색 속도를 향상시켜주는 자료구조
  • 인덱스는 보통 B-Tree로 구현되며, 다른 것으로는 Hash Table, Bitmap 등이 있음
  • 인덱스를 테이블의 특정 컬럼에 생성하면 해당 컬럼의 값을 정렬하여 별도의 메모리 공간에 데이터를 물리적 주소와 함께 저장함
  • 인덱스는 insert, update, delete 와 같은 데이터 변경 작업을 느리게 할 수 있지만, select와 같은 검색 작업은 빠른 수행 가능
  • 인덱스는 적절하게 설계하고 유지보수하는 것이 DB 성능 향상에 중요한 역할을 함

예를 들면, 책에서의 목차 또는 색인이라 볼 수 있다. 목차를 보고 빠른 내용을 찾을 수 있기 때문이다.

 

1-1. 왜 인덱스를 사용하면 검색 속도가 빠를까?

  • 기존 where 문으로 특정 조건 데이터를 찾기 위해서는 전체 테이블 스캔 작업이 필요함
  • 인덱스를 이용하면 데이터들이 정렬되어 있기에 조건에 맞는 데이터를 더 빠르게 탐색 가능
  • 또한, order by문이나 min/max 같은 경우도 이미 정렬되어 있기에 빠른 수행 가능
전체 테이블 스캔(Full Table Scan) : 테이블에 존재하는 모든 데이터를 읽으면서 조건 비교
인덱스 스캔(Index Scan) : 인덱스를 구성하는 컬럼의 값을 기반으로 데이터를 추출하는 액세스 기법

 

2. Hash Table이란?

  • 간단하고 빠른 검색이 가능한 자료구조
  • 등호 연산에 최적화되어 있으며, key-value 구조로 데이터 저장
  • 인덱스에서는 컬럼 값이 key, 저장된 레코드의 물리적 주소가 value
  • 해시 함수를 이용해 key를 해시값으로 변환하고, 이를 이용해 빠른 데이터 검색 가능
  • 해시 함수를 이용할 때 충돌 발생 시, 일반적으로 해시 테이블은 각각의 슬롯에 연결리스트 사용해서 충돌 처리(Separate Chaining)
  • 해시 테이블은 검색 속도가 매우 빠르지만, 범위 검색에는 적합하지 않음
  • 범위 검색이 자주 일어나는 경우 B-Tree와 같은 자료구조를 사용하는 것이 좋음

 

2-1. Hash Table에서 범위 검색은 왜 비효율적일까?

  • 범위 검색 수행 시, 일반적으로 연속된 인덱스 엔트리를 찾아야함
  • 해시 테이블은 해시함수에 의해 무작위로 분산되어 저장되기에 인덱스 엔트리들이 서로 물리적으로 연속되어 저장되지 않을 수 있음
  • 이 경우, 연속된 인덱스 엔트리를 찾기 위해 모든 인덱스 엔트리를 검색해야 하기 때문에 비효율적
  • 따라서, 해시 테이블은 주로 동등비교(equality search)에 사용하며, 범위 검색에는 비효율적
인덱스 엔트리(Index Entry)란?
- DB 인덱스에서 각각의 인덱스 키 값에 대한 정보를 담고 있는 데이터 레코드를 말함
- 인덱스 엔트리에는 인덱스 키 값과 해당하는 레코드의 위치 정보가 포함
- 인덱스 엔트리는 인덱스 자료구조의 종류에 따라 다양한 방식으로 구현됨
- B-Tree에서는 인트리가 키와 포인터로 이루어짐
- Hash Table에서는 해시값과 해당 키에 대응되는 데이터 레코드의 위치 정보로 이루어짐

 

3. B-Tree란?

  • 자주 사용되는 데이터를 효율적으로 검색하기 위해 설계된 트리 구조
  • B-Tree는 Balanced Tree의 약자로, 트리의 균형을 유지하여 검색 속도를 높이는 것이 핵심
  • DB 인덱스를 구현하는 데 많이 사용되며, 대용량 데이터를 저장 및 검색하는 데 매우 효율적

 

3-1. B-Tree 특징

  • 균형 잡힌 트리
  • 여러 개의 자식 노드를 가질 수 있음
  • 각 노드에는 여러 개의 데이터가 저장될 수 있음
  • 데이터 삽입, 삭제, 검색할 때 모든 연산은 트리의 높이에 비례
  • 평균적으로 시간 복잡도는 O(log n)

 

4. 인덱스 사용 시 주의사항

  • 자주 검색하지 않는 컬럼이면 인덱스 생성 및 관리 비용이 더 늘어날 수 있음
  • 중복 인덱스 방지
    • 동일 컬럼을 기준으로 여러 개의 인덱스 생성하지 않도록 주의
    • 중복된 인덱스는 불필요한 저장공간을 차지하며 데이터 삽입, 삭제, 수정 시에도 불필요한 비용 발생 가능
  • 인덱스는 공간적 비용이 발생하므로, 너무 많은 인덱스는 성능 저하가 올 수 있음
  • 필드의 크기가 크면 인덱스의 크기도 커짐
  • 인덱스를 지정하면 데이터 삽입, 수정, 및 삭제의 성능이 감소될 수 있음

 

4-1. 범위 조건 검색일 때 인덱스 사용 주의사항

  • 인덱스는 특정 열에 대한 검색을 빠르게 수행할 수 있도록 테이블의 데이터를 정렬하여 저장함
  • 인덱스의 효율성은 범위 조건 검색의 시작점과 종료점을 찾는 것에 크게 영향을 받음
  • 예를 들면, `WHERE age BETWEEN 20 AND 30` 과 같은 쿼리 실행 시
    • `age` 열에서 20~30까지의 범위를 찾아야 함
    • 만약 인덱스에서 20~30까지의 값이 연속적으로 저장되어 있다면 인덱스를 효율적으로 사용 가능
    • 만약 인덱스에 20,25,30,35와 같이 불규칙하게 저장되어 있다면 인덱스를 사용할 수 있으나 매우 많은 페이지를 탐색해야 하므로 검색 성능이 떨어짐
  • 위 예시를 이유로 범위 조건 검색에서는 인덱스의 효율성이 상대적으로 떨어질 수 있음
저작자표시 비영리 (새창열림)

'데이터베이스' 카테고리의 다른 글

FK(외래키)를 주식별자인 기본키(PK)로 꼭 넣어야할까? 아니면 비식별자로 넣어야할까?  (2) 2024.02.05
맥 m1 mysql 데이터베이스 경로(위치) 찾기  (0) 2023.08.01
H2 데이터베이스 설치  (0) 2022.02.17
오라클 클라우드 DB - 스프링부트 프로젝트 연결  (4) 2022.02.13
오라클 클라우드 DB 생성  (1) 2022.02.09
    '데이터베이스' 카테고리의 다른 글
    • FK(외래키)를 주식별자인 기본키(PK)로 꼭 넣어야할까? 아니면 비식별자로 넣어야할까?
    • 맥 m1 mysql 데이터베이스 경로(위치) 찾기
    • H2 데이터베이스 설치
    • 오라클 클라우드 DB - 스프링부트 프로젝트 연결
    묠니르묘묘
    묠니르묘묘

    티스토리툴바