SQL INDEX

yozzum·2022년 9월 9일
0

SQL

목록 보기
3/25

● INDEX 종류

  • B-Tree(Balanced-Tree)*
  • Beatmap
  • IoT
  • Cluster
  • 테이블은 하나의 오브젝트입니다.
  • Index도 오브젝트입니다.
  • Index가 생성되면, 기존 테이블과 매핑되는 또 하나의 테이블이 생성되는 것으로 생각하면 됩니다.
  • 보통 테이블은 특정 컬럼을 기준으로 정렬되어있지 않기 때문에 어떤 값을 찾을 때 Full Scan이 일어납니다.
  • Index 테이블은 Index 컬럼을 기준으로 정렬되어 저장되어 있습니다.
  • 따라서 Index 테이블 활용하면 특정 조건의 데이터를 조회할 때 시작점을 지정하고 거기서부터 스캔을 할 수 있습니다.
  • Index 테이블에서 먼저 데이터들을 찾은 다음에, 그 테이블로 매핑된 곳에가서 나머지 칼럼(데이터를) 꺼내오는 방식입니다.
  • 매핑방식은 Pointer 처럼, Index가 기존 테이블의 블럭 주소를 가지고 있다고 생각하면 됩니다.
  • 블럭은 데이터가 저장되는 최소단위이고, 데이터들이 로우단위로 저장되어 있습니다.
  • 테이블의 컬럼 수가 많다면, 하나의 블럭에 저장되는 로우 수가 적어집니다. and vice versa.
  • 따라서 WHERE, 그리고 order by 절에 자주 등장하는 컬럼을 인덱스로 설정해주면 효율적이게 됩니다.
  • Index는 단일 컬럼을 기준으로 할 수도 있지만, 여러 컬럼을 조합해서 결합 Index로 구성할 수도 있습니다.
  • 결합 Index를 구성할 때는 select절에 자주 등장하는 컬럼들과 조합해서 결합 Index를 구성하면 매핑된 테이블에 가서 데이터를 꺼내올 필요없이, Index 테이블에서 바로 데이터를 가져올 수 있습니다.
  • 그렇다고 너무 많은 Index를 생성하게되면, select는 빨라지겠지만, Insert나 update는 속도가 오히려 느려집니다.
  • 결합인덱스를 구성할때는 순서가 중요합니다.
  • 성별보다는 ID와 같이 분별력이 높은 칼럼이 앞으로 오도록 하는 것이 효율적입니다.
  • Index 칼럼 가공이 필요할 때
where substr(order_no, 1, 4) = '2019'
> where order_no like '2019%'
  • Index 칼럼의 형변환(같은 타입으로 비교해야함)
where reg_date = '20190730'
> where reg_date = to_date('20190730', 'YYYYMMDD')
  • Index 칼럼 부정형 비교
where mem_type != '10'
> where mem_type in ('20', '30')
  • like 연산자 사용 시 %가 앞에 위치하도록 한다.

  • or 조건보다는 union all을 사용한다.

● Index 스캔 방식

  • Index range scan : 어떤 시작점부터 특정 범위 스캔
  • Index full scan
  • Index skip scan
  • Index fast full scan

※ index를 활용한다고 무조건 빨라지는 것이 아닙니다. 테이블의 전체 데이터양의 10~15% 이내의 데이터가 출력될 때만 인덱스를 통하는것이 빠르고, 그 이상이 될 때는 오히려 full scan이 더 빠릅니다.

profile
yozzum

0개의 댓글