Free Lines Arrow
본문 바로가기
DataBase/DB 기초

[DB] Index 기본

by skahn1215 2023. 2. 9.
728x90
반응형

인덱스 란?

  • 원하는 데이터를 쉽게 찾을수 있도록 돕는 자료구조이다.
  • 검색 조건에 부합하는 데이터를 효과적으로 빠르게 검색 할 수 있도록 돕는다.
  • 하지만 인덱스 효율이 나쁘면 오히려 느릴 수 있다.
  • 1개의 테이블에 인덱스가 많은면 CUD 작업시 부하가 발생 할 수 있다.
    - 이유는 저장 하거나 업데이트 할때 인덱스 값을 조정 해줘야 하기 때문이다.

 

인덱스의 자료구조

Hash

  • 해시는 탐색 시간이 빠르지만 자료를 저장 할때 정렬이 되지 않는다.
    당연한것이 해쉬 자료구조 이기 때문이다. 
    DB 에서는 특정 범위를 검색하는 경우가 있는데 이에 적절하지 않아서 잘 사용하지 않는다.
     

B * Tree

  • DB 에서 가장 많이 사용하는 인덱스 구조이다.

 

B * Tree 인덱스 란?

  • DBMS 에서 사용되는 가장 일반적인 인덱스이다.

 

B * Tree  구조

  • 루트블록
    - 가장 상위에 존재하는 블록
  • 브랜치 블록
    - 분기 목적의 블록
  • 리프 블록
    - 트리의 가장 아래 단계에 존재하는 블록

 

다음예제는 직원 테이블에 직원명으로 인덱스가 걸려 있을때
동작하는 방식이다.

SELECT * FROM 직원
WHERE 직원명 = '차두식'

 

 

  • 각각의 블록 들은 하위 블록에 대한 주소 값을 갖는다.
  • LMC 가 가르킨 블록에는 첫번째 레코드 보다 작거나 같은 레코드가 저장
  • 리프블록의 각레코드는 정렬 되어 있으며 테이블 레코드를 가리키는 주소값을 가진다.
  • 인덱스 키 값이 같으면 ROWID 순으로 정렬된다.
  • 인덱스를 스캔하는 이유는 소량의 데이터를 빨리 찾고 ROWID 를 얻기 위함이다.
  • ROWID 를 얻어 테이블에 접근 하여 컬럼을 찾아간다.

 

효율적인 인덱스를 위해

  • 카디널리티가 높은 컬럼을 선택하자.
    - 카디널리티가 높다는 것은 중복도가 낮다는 것이다.
    - 예를 들어 주민번호 같은경우는 중복도가 없다 -> 카디널리티가 높다.

 

랜덤 액세스 최소화

  • 인덱스 스캔을 최소화 하자
    인덱스 스캔후 추가 정보를 가져오기 위해 리프 블록에 있는 ROWID를 가지고  테이블에서 해당 행을 찾기 위한
    테이블 랜덤 액세스를 수행한다. 테이블 랜덤 액세스는 DBMS 성능 부하의 주 요인이다.
  • 인덱스 스캔이 비효율 적이라 판단이 되면 풀스캔을 하게 된다.
  • 테이블 풀 스캔은 랜덤 액세스가 발생하지 않는다.

 

풀스캔을 하는 경우

  • 조건문이 없는경우
  • 사용가능한 인덱스가 없는경우
  • 풀스캔이 유리하다고 판단되는 경우
  • LIKE 에서 %text% 로 조회 하는 경우

 

 

참고:

이경오의 SQL+SQLD 

728x90
반응형

'DataBase > DB 기초' 카테고리의 다른 글

[DB] LIKE 와 INDEX  (0) 2023.02.10
[DB] NoSQL  (0) 2021.08.19
[DB] Index 기초  (0) 2021.08.19
[DB] GROUP BY  (0) 2021.08.05
[DB] Join  (0) 2021.08.05

댓글