• 인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용한다.
  • 인덱스의 핵심 요소는 2가지로 나눌수 있다.
    • 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것이다.(인덱스 스캔 효율화 튜닝)
    • 테이블 액세스 횟수를 줄이는 것이다.
  • 인덱스를 사용하면 테이블을 전체읽지 않고 일부만 읽고 멈출 수 있다. 즉, 범위 스캔(Range Scan)이 가능하다.
  • 범위스캔이 가능한 이유는 인덱스가 정렬되어 있기 때문이다.
  • DBMS에선 일반적으로 B(Balanced)-Tree 인덱스를 많이 사용한다.

과거에 작성한 내용

  • 어떤 데이터를 찾기위한 색인
  • Index도 하나의 데이터베이스 객체이기 때문에 저장 공간이 필요하다.
1create index [인덱스명] on [테이블명](컬럼명1, 컬럼명2 ... );

Full Table Scan

  • 테이블에 있는 모든 데이터를 읽어서 원하는 데이터를 찾아낸다.

Binary Search

  • 사용하기 위해선 데이터가 정렬되어 있어야 한다.
  • 데이터의 가운데 위치(값이 아님!!)에 있는 값을 확인한다.
  • 찾으려고 하는 값보다 작다면 좌측을 버리고, 찾으려고 하는 값보다 크다면 우측을 모두 버린다.

Binary Search Tree

  • 자식노드가 최대 2개까지만 존재할 수 있는 트리이다.
  • 데이터가 정렬된 채로 트리를 이루고 있다. 즉, 특정 노드를 선택하면 해당 노드의 subtree들 중 좌측에 있는 노드는 모두 작은 값이다.

B-Tree ( Balanced Tree )

  • Binary Tree와 달리 높이(Height)가 같은 Tree

Clustered Index

  • 군집화된 인덱스라는 뜻이며, 좀더 풀어서 설명하면 인덱스와 데이터가 한데 모여있다는 뜻이다.
  • 데이터가 이미 PK를 기준으로 정렬되어 있기때문에 범위검색할때 높은 효율을 보인다. 특정 범위를 그냥 긁어오기만 하면됨.
  • PK로 정렬을 해야되기 때문에 PK가 하나로 이뤄진 테이블일때 좋다.
  • 따라서 Auto_Increment로 PK를 따는게 좋다.
  • 테이블 중간에 Insert를 하게된다면 페이지 분할 작업을 수행해야하기때문에 성능 저하를 가져올 수 있다.

Non-Clustered Index

  • 데이터와 연결되어 있지않고, 어떤 인덱스와 연결되어 있다.
  • 순서와 상관이 없고 Hash함수 방식으로 찾아내기때문이다.
  • 한 테이블에 여러개의 PK가 있을수 있다. PK를 찾아서 또다른 PK를 찾아갈 수 있음.
  • PK를 찾기위해 추가적인 저장공간이 10% 필요하다.
  • Insert를 수행하면 인덱스 생성을 위한 추가 작업이 생긴다.
  • 중복된 데이터가 많을수록 Cardinality는 떨어진다. ( ex. 성별 같은 컬럼은 50대50이기때문에 굳이 인덱싱 테이블을 볼 필요가 없이 풀스캔하는게 낫다. )
  • 주민등록 번호같이 고유한 데이터일수록 Cardinality가 높다고 말한다. Cardinality가 높을수록 인덱스 사용을 고려하라!!