Index에 대하여

litien·2019년 12월 3일
0

인덱스란?

인덱스는 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것이다.

삽입,삭제,갱신의 성능을 희생하고 조회의 성능을 향상시킨다.

인덱스 종류에 따라 물리적인 공간을 요구하며, 옵티마이저는 생성한 인덱스 중 어느 인덱스를 선택해야 하는지에 대한 계산비용도 들어가게 된다.

인덱스를 통해 읽는 레코드 한건 한건이 I/O다. 때문에 인덱스를 통해 읽어야 할 데이터 레코드가 20~25%를 넘으면 인덱스보다 테이블 데이터를 직접 읽는 것이 효율적이다.

단 갱신과 삭제를 하기위한 레코드를 찾는데는 빠르다. 때문에 인덱스가 있는 컬럼을 기준으로 갱신과 삭제를 하는것이 좋다

자료구조

인덱스의 자료구조는 SortedList로 저장되는 값을 항상 정렬된 상태로 유지한다.

정렬되어 있음으로 SELECT 쿼리 속도가 빠르나, INSERT, UPDATE, DELETE 쿼리는 정렬을 해야하기 때문에 쿼리 수행시간이 늘어난다.

인덱스 컬럼 주의사항

  • 카디널리티가 가장 높은 값 ( 중복되지 않은 값들의 수 )으로 잡는 것이 좋다.
  • 첫번째 인덱스 컬럼이 조회 쿼리에 없으면 인덱스를 타지 않는다.
  • 범위 조건은 해당 컬럼은 인덱스를 타지만, 그 뒤 인덱스 컬럼들은 인덱스가 허용되지 않는다.
  • 인덱스 컬럼값 그대로 사용해야만 인덱스를 탄다.

저장방식

B-Tree Index

  • 가장 일반적으로 사용되는 인덱스 알고리즘
  • 컬럼값을 변형하지 않고, 원래 값을 기준으로 이용해서 인덱싱
  • 루트 노드, 브렌치 노드, 리프 노드로 나누어짐
  • 리프노드는 데이터가 저장된 레코드의 주소를 가지게 된다.

Hash Index

  • 컬럼 값으로 해시 값을 계산해서 인덱싱
  • 값을 변형해서 인덱싱함으로 전방일치와 같이 값의 일부만 검색하고자 할 때는 사용 할 수 없다.
  • 주로 메모리 기반의 DB에서 많이 사용한다.

스캔방식

인덱스 레인지 스캔

  • 검색해야 할 인덱스의 범위가 결정됬을 때 사용하는 방식. 루트 노드부터 비교를 시작해 브랜치 노드를 거치고 최종적으로 리프노드까지 찾아 시작 지점을 찾을 수 있다. 시작 위치를 찾으면 리프노드의 레코드만 순서대로 읽으면 된다.

인덱스 풀 스캔

  • 인덱스의 처음부터 끝까지 모두 읽는다. 리프노드의 제일 앞 또는 뒤로 이동한 후 리프노드를 연결하는 링크드 리스트를 따라서 처음부터 끝까지 스캔

루스 인덱스 스캔

  • 중간마다 필요하지 않은 인덱스 키 값을 무시하고 다음으로 넘어간다
  • 일반적으로 GROUP BY 또는 MAX, MIN 함수에 대해 최적화를 하는 경우 사용

Reference

https://jojoldu.tistory.com/243

https://12bme.tistory.com/138

profile
어려운 문제를 함께 풀어가는 것을 좋아합니다.

0개의 댓글