Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TIL] DB 인덱스 내부 동작 원리 #15

Open
yunyoung1819 opened this issue Oct 22, 2023 · 0 comments
Open

[TIL] DB 인덱스 내부 동작 원리 #15

yunyoung1819 opened this issue Oct 22, 2023 · 0 comments
Assignees
Labels

Comments

@yunyoung1819
Copy link
Owner

yunyoung1819 commented Oct 22, 2023

Date

  • 2023.10.22

Title

DB 인덱스 내부 동작 원리

Description

인덱스(Index)

  • 인덱스(Index)는 **RDBMS(관계형 데이터베이스 관리 시스템)**에서 테이블에 대한 검색 속도를 높여주는 자료 구조
  • 테이블 내에 1개 컬럼 혹은 여러 개 컬럼을 이용하여 생성
  • 특정 테이블의 컬럼을 인덱싱(indexing)하면 검색할 때 테이블의 레코드를 전부 확인하는 것이 아니라 인덱싱 되어 있는 자료구조를 통해 검색되기 때문에 검색 속도가 빨라짐

인덱스가 동작하는 과정

index
  • 인덱스에는 여러가지 유형이 있지만 그중에서도 많이 사용되는 인덱스 구조는 B+TREE 구조이다.
  • 인덱스가 생성되었다면 SELECT 쿼리문에서 Index 생성 컬럼을 WHERE 조건으로 걸거나, Index 컬럼으로 Order By에 의한 Sort를 적용하는 등의 작업을 하면 옵티마이저에서 판단하여 생성된 인덱스를 적용하여 SELECT 문이 실행된다.
    • 옵티마이저(Optimizer): 옵티마이저는 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진
  • 인덱스가 설정되지 않았을 때는 데이터를 검색하게 되면 WHERE 절 조건에 맞는 데이터를 찾아내기 위해 테이블의 레코드를 처음부터 끝까지 다 읽으면서 검색 조건과 맞는지를 비교함. 이것을 'Full Table Scan' 이라고 한다.
  • Full Table Scan은 가장 느린 Scanning 방법으로 전체 데이터를 읽는 과정에서 많은 자원을 소모
  • 쿼리를 통해 'Name이 HOLLY인 데이터를 조회'한다고 했을 때 Name 컬럼을 인덱싱 해놓은 상태라면 해당 Index를 통해 Name을 먼저 조회하고 Name의 Location 값을 통해 실제 테이블에 있는 값들을 조회함
  • 전체 데이터를 비교할 필요가 없음
index scan
  • 인덱스를 통한 검색을 B+TREE에서 Leaf Node까지 찾아 내려가서 해당 데이터를 찾기 위해 디스크로 접근하는 과정을 거침
  • 데이터의 양이 많지 않거나, Index가 효율적으로 설정되어 있지 않은 경우 오히려 Table Full Scan이 더 빠름

인덱스의 단점

  • Index는 검색 속도를 향상하는 장점이 있지만 항상 정렬된 상태를 유지
  • insert, update, delete 과정에서는 Table의 Index 정보를 갱신하는 비용이 추가되어 상대적으로 속도가 저하되는 단점이 있음
    • insert: 새로운 데이터에 대한 인덱스가 추가
    • update: 기존 인덱스를 제거하고 갱신된 데이터에 대한 인덱스를 추가
    • delete: 삭제하는 데이터의 인덱스를 제거
  • 데이터 갱신보다는 조회에 주로 사용되는 컬럼에 인덱스를 생성하는 것이 유리

Reference

@yunyoung1819 yunyoung1819 self-assigned this Oct 22, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant