Index란 자주 조회되고 분산도가 높은 데이터를 빠르게 조회하기 위해 구축한 것입니다. 디스크를 다 조회하는 것보다 메모리에 있는 Index를 활용합니다. 인덱스 구축 시 사용되는 칼럼과 ROWID(데이터 주소, 저장위치 오브젝트 번호+블로번호 등)로 구성되어있다.
Index는 탐색을 빠르게 하기 위함이고, 별도 자료구조를 생성하는 것만큼 쓰기 성능은 떨어지면 이는 트리형 Index가 트리를 유지하기 위해서 Rebalance하기 때문이다.
Hash, B-, B+ 등이 Index 구축 시 사용되지만 Hash가 탐색 시 O(1) 로 빠르지만, 특정 범위의 값을 조회할 때 찾을 수 없기 때문에 잘 사용되지 않는다. B-, B+트리는 balanced tree인데 보통은 B+트리를 많이 사용하게 된다. B+트리는 leaft node에 모든 key,data가 링크드리스트로 되어있어 순차탐색(정렬)에 유리하다. B- 경우 best case에 루트에서 끝날 수 있지만 그게 아니라면 leaf노드 갔다가 internal node갔다가 비용이 많이 든다. 또한 leaf node에만 데이터가 있어서 메모리 측면에서도 좋다.
하지만 무조건 인덱스를 구축하는 것은 좋지 않다.
1. 성별 같이 카디널리티가 낮은 칼럼에 Index
랜덤엑세스를 이용하는 곳은 고비용 구조이기 때문에, 항상 테이블 전체 읽고(Multi Block I/O, sequential access, 순차탐색) 몇 건 조회하든 성능 같은 Table Full Scan과 달리 Index 사용한 조회에는 일정 기준 넘어가면 성능이 크게 달라진다(Single Blokc I/O, random access).
2. 큰 데이터 적은 양 데이터 조회 시
Index Unique Scan
Index Unique Scan은 결과로 하나의 건이 반환될때 사용되고 칼럼이 유일한 값으로 구성되어야 합니다. 즉 Primary Key에 기본적으로 생성되는 인덱스입니다. 조건 검색이 단일(=)인 경우 사용하게됩니다.
Index Range Scan
Index Range Scan은 가장 일반적인 Index의 탐색 방식입니다. Index를 수직 탐색 후 필요한 범위까지만 탐색은 하는 방식입니다. 인덱스의 데이터는 정렬된 상태로 저장이 되므로 범위에 대한 탐색이 필요할때 효율적으로 데이터를 탐색할 수 있으며 리프 블록에서 다음 리프블록의 정보를 갖고 있어 다시 브랜치 블록을 읽을 필요없이 다음 데이터를 바로 읽을 수 있습니다. 이런 특징을 잘 활용하면 정렬작업을 생략하거나 최대값, 최솟값을 찾는데 유용하게 활용될 수 있습니다.
Index Full Scan
Index Full Scan은 첫번째 리프블록까지 수직적 탐색 후, 인덱스 전체를 탐색하는 방법입니다. 주로 테이블에서 Table Full Scan의 부담이 크거나 정렬작업을 생략하기 위해 테이블 전체를 탐색하는 것보다 Index를 사용하는 것이 유리하다.
https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-B-Tree
https://rebro.kr/167?category=484170