소피it블로그
[DB] 인덱스(Index) 본문
1. 인덱스를 사용하는 이유
자주 사용되는 칼럼에 대하여 인덱스 테이블을 따로 만들면 데이터를 빠르게 검색할 수 있다.
2. B-Tree
인덱스는 보통 B-Tree 자료구조로 이루어져 있는데, 균형 잡힌 트리 구조와 트리 깊이의 대수확장성(트리 깊이가 리프 노드 수에 비해 매우 느리게 성장함) 덕분에 매우 효율적인 검색이 가능해진다.
루트 노드에서 시작하여 브랜치 노드들을 거쳐 찾고자 하는 데이터가 있을 법한 리프 노드에 들어가 탐색하는 방식으로 작동하며, 리프 노드에 도달한 후에 데이터 포인터를 통해 결괏값을 반환한다.
해시 테이블 대신 B-Tree를 사용하는 이유는, SELECT 질의 조건에는 부등호 연산도 포함되는데 해시 테이블은 동등 연산에 특화된 구조이기 때문이다.
3. 주의할 점
무조건 인덱스를 사용하는 것은 지양하여야 한다. 인덱스를 사용하는 것이 오히려 성능상 비효율적인 경우도 있다.
인덱스를 사용할 경우 두 번 탐색을 해야 하기 때문에, 관련 읽기 비용이 든다. 또한, 컬렉션이 수정되었을 때 인덱스도 수정되어야 하는데, 이 때 B-Tree의 높이를 균형 있게 조절하고 데이터를 효율적으로 분산시키는 비용도 든다.
복합 인덱싱을 효율적으로 하기 위해서는 값끼리 같음을 비교하는 ==나 equal이 포함된 쿼리를 먼저 인덱스로 설정하는 것이 좋다. 또한 카디널리티(유니크한 값의 정도)가 높은 순서를 기반으로 인덱스를 생성하는 것이 효율적이다. 카디널리티가 낮은(=중복도가 높은) 성별 등의 컬럼은 인덱스로 만들어도 성능상의 이점이 없다.
참고자료:
https://github.com/WeareSoft/tech-interview/blob/master/contents/db.md#4-database
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 트랜잭션(Transaction) (0) | 2022.11.13 |
---|---|
[DB] 정규화(Normalization) (0) | 2022.11.13 |
[DB] 데이터베이스 기본 (0) | 2022.11.13 |
[SQL] 프로그래머스 SQL 고득점 Kit -String, Date (MySQL) (0) | 2022.11.04 |
[SQL] 프로그래머스 SQL 고득점 Kit -JOIN (MySQL) (0) | 2022.11.04 |