테이블에 대한 동작 속도를 높여주기 위한 자료구조
책의 목차와 같이 DB의 Index도 Query의 SELECT 문의 속도를 향상시키는 역할을 한다.
Index도 하나의 DB 객체이므로 따로 저장 공간이 필요하며, 보통 저장된 공간의 10% 정도가 Index를 위한 저장 공간으로 사용된다.
특정 컬럼에 Index를 설정해서, 해당 컬럼을 기반으로 데이터를 정렬한 후 별도 메모리 공간에 데이터 물리적 주소와 함께 Index를 저장하게 된다
책 내용 - 데이터
책 목차 - Index
책 페이지 번호 - 물리적 주소
Index의 핵심은 Index에 의해 데이터가 정렬된 형태를 갖는 다는 점!!
1. Full Table Scan - Index가 없을 경우
DB의 모든 데이터를 하나하나 대조하면서 원하는 데이터를 찾는 방식
2. Index Scan - Index가 있을 경우
Index를 참고해 특정 데이터를 찾음
대표적으로 B-Tree 자료구조가 있다
기존의 이진 트리(Binary Tree)는 노드 수가 2개로 제한 되어있고 한쪽 노드에 트리 구조가 몰리는 단점이 존재
B-Tree(Balanced-Tree) 구조는 자식 노드를 2개 이상 가질 수 있고, Root 노드 부터 leaf 노드까지 거리가 일정하다는 특징이 있음
Index 안에 데이터가 포함(Index와 데이터가 군집)
DB와 가까운 모습으로 다시 살펴 보면 H라는 데이터를 찾는을 때 2번의 이동만 하면 된다
루트 페이지에서 101 브랜치 브랜치로 이동
→ 101 브랜치에서 1002 리프 페이지로 이동
Index 안에 데이터가 포함되지 않음(Index와 데이터가 따로 존재)
데이터 페이지가 닉네임 순으로 정렬되어 있지 않지만, Index 쪽은 닉네임 순으로 정렬이 되어 있다
여기서 "검프"라는 데이터를 넣는 다면 아래와 같아진다
데이터 페이지에서는 제일 마지막에 데이터가 삽입되지만, Index 페이지에서는 정렬이 발생해 루트 페이지가 변하게 된다
따라서 INSERT, UPDATE, DELETE시 Clustered Index에 비해 성능 하락이 덜하다는 상대적인 장점이 있지만, 조회시 리프 페이지에 있는 데이터 주소로 다시 데이터 페이지를 이동해야하는 단점이 있다
어떤 컬럼에 Index를 생성하냐에 따라 Query문의 성능이 좌우하게 된다
보통 Index를 설정하는 컬럼은 Cardinality가 높은 컬럼일 수록 더 적합하다고 판단한다
Cardinality가 높다 = 한 컬럼이 가지는 값의 중복도가 낮다 = 컬럼의 데이터 값이 다양하다
성별과 이름, 전화번호 3 컬럼이 있을 때, 중복된 수치가 낮은 전화번호 컬럼에 Index를 생성하는 것이 효율적이다
출처
우아한 테코톡 - 찰리의 인덱싱
https://www.youtube.com/watch?v=P5SZaTQnVCA
[Database] 인덱스(index)란?
https://mangkyu.tistory.com/96
[Database] Clustered Index와 Non-Clustered Index
https://pangtrue.tistory.com/286