본문 바로가기
Back-End/Database

데이터베이스 인덱스

by 코젼 2025. 3. 10.
728x90
반응형
  • 인덱스는 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조로 백과사전의 색인과 같다.
  • 저장되는 컬럼을 사용하여 항상 정렬된 상태유지하는 것이 특징이다.
  • 이러한 특징으로 인해 인덱스는 INSERT, UPDATE, DELETE성능희생된다는 것이 단점을 가지고 있다.

인덱스 자료 구조 (MySQL InnoDB 기준)

  • B+Tree와 같은 변형 B-Tree 자료구조를 이용해서 인덱스를 구현한다.
  • 기본 토대는 B-Tree 인덱스이기 때문에, 컬럼의 값을 변형하지 않고 인덱스 구조체 내에서 항상 정렬된 상태유지합니다.

B-Tree(Balanced-Tree)

  • B-Tree(Balanced-Tree)에서는 크게 3가지 노드가 존재한다.
    • 최상위에 하나의 루트 노드
    • 가장 하위 노드인 리프 노드
      • 실제 데이터 레코드를 찾아가기 위한 주소값을 가지고 있습니다.
    • 이 두 노드의 중간에 존재하는 브랜치 노드

InnoDB 스토리지 엔진에서는 세컨더리 인덱스(프라이머리 인덱스를 제외한 모든 인덱스)의 리프 노드에는 레코드의 PK가 저장된다. 따라서 세컨더리 인덱스 검색에서는 레코드를 읽기 위해 PK를 가지고 있는 B-Tree다시 한번 검색해야한다.

MySQL 스캔 방식

  • 인덱스 레인지 스캔
  • 인덱스 풀 스캔
  • 루스 인덱스 스캔

인덱스 레인지 스캔

인덱스 레인지 스캔(Index range scan) 은 검색인덱스 범위가 결정되었을 경우 사용하며 가장 빠르다.

  • 인덱스에서 조건만족하는 값이 저장된 시작 리프 노드를 찾습니다.(index seek)
  • 시작 리프 노드부터 필요한 만큼 인덱스차례대로 읽습니다. (index scan)
  • 인덱스 레코드 주소를 이용해 저장된 페이지를 가져오고 레코드를 읽어옵니다.

레코드를 읽어오는 과정에서 랜덤 IO가 발생할 수 있다. 읽어야할 데이터 레코드가 전체 20-25% 의 경우에는 풀 테이블 스캔(순차 IO를 이용) 이 더욱 좋을 수 있습니다.

인덱스 풀 스캔

인덱스 풀 스캔 (Index full scan) 은 인덱스를 사용하지만 인덱스를 처음부터 끝까지 모두 읽는 방식이다.

  • 인덱스를 ABC 순서로 만들었는데 조건절에 B 혹은 C로 검색하는 경우 사용한다.
  • 인덱스를 생성하는 목적은 아니지만, 데이터 레코드까지 읽지 않는 경우 풀 테이블 스캔보다는 낫다.

루스 인덱스 스캔

루스 인덱스 스캔 (loose index scan) 은 듬성듬성하게 인덱스를 읽는 것을 의미한다. (앞서 언급한 인덱스 레인지, 인덱스 풀 스캔은 타이트 인덱스 스캔으로 분류)

  • 중간필요하지 않은 인덱스 키 값무시하고 다음으로 넘어가는 형태로 처리한다.
  • group by, max(), min() 함수에 대해 최적화하는 경우에 사용된다.
728x90
반응형

'Back-End > Database' 카테고리의 다른 글

데이터베이스 커넥션 풀 미사용 시 발생 문제  (0) 2025.03.28
공유 락과 배타 락  (0) 2025.03.21
재귀적 CTE(Common Table Expression)  (0) 2024.08.01
Transaction  (0) 2024.07.23
MySQL root 계정 비밀번호 재설정  (0) 2024.07.09

댓글