인덱스는 쉽게 말해 책의 '목차'를 예시로 들 수 있습니다. 만약 특정 챕터를 찾아보고 싶다면, 책의 목차(Index)에서 찾고 목차에 적힌 page로 이동하면 됩니다.
DB에서 index 또한 같은 의미며, 데이터의 위치를 가리키는 지표로 테이블이나 뷰의 행 검색 속도를 향상시켜주는 자료구조 입니다.
이러한 인덱스를 생성하게되면 다음과 같은 특징이 있습니다.
- 검색 속도 향상 (*시스템의 부하를 줄여, 전체 성능 향상에 기여)
- 인덱스를 위한 추가 행이 필요
- Insert, Update, Delete가 빈번하게 발생하면 성능이 많이 하락할 수 있음
- Index는 SQL Server에서 키 값과 연결된 행을 빠르고 효율적으로 찾을 수 있도록 B-Tree 구조로 저장됨
Database에서는 index 구조가 크게 Clustered-Index와 NonClussted-Index (Secondary-Index)로 나뉩니다.
Clustered Index (군집화된 인덱스)
Clustered Index는 데이터가 테이블에 물리적으로 저장되는 순서를 정의하여, 이 컬럼을 기준으로 데이터를 정렬하고 저장합니다.
테이블의 데이터는 한가지 방법으로만 정렬이 가능하기 때문에, 테이블 당 하나의 클러스터 형 인덱스만 존재할 수 있습니다.
Database에서는 primary key의 제약조건(constraint)으로 클러스터 된 인덱스를 자동으로 생성해 줍니다.
이 클러스터형 인덱스는 검색 속도를 향상시킨다는 장점이 있지만, 새로운 데이터를 삽입할 때는 많은 비용이 소모되는 단점이 존재합니다.
예를들면, 새로운 데이터를 3번 바로 뒤에 넣고 싶다면, 3번 뒤의 데이터들은 모두 한 줄씩 이동시켜줘야 합니다.
때문에 어떤 column을 primary key로 설정하는지에 따라 db성능이 좌우됩니다.
Clustered Index의 구조는 위와 같으며, 크게 Clustered Key를 관리하는 Root Page와 각 데이터를 쪼개서 순차적으로 정렬해둔 Data Page(Leaf Page)가 있습니다. Clustered Index는 다음과 같은 경우에 생성하는 것이 좋습니다.
- 테이블 데이터가 자주 업데이트 되지 않는 경우
- 항상 정렬 된 방식으로 데이터를 반환해야하는 경우
- 테이블은 정렬되어있기 때문에 ORDER BY 절을 활용해 모든 테이블 데이터를 스캔하지 않고 원하는 데이터를 조회할 수 있음
- 읽기 작업이 월등히 많은 경우
NonClustered Index (비군집화 인덱스, Secondary Index)
NonClustered Index는 테이블에 저장된 물리적인 순서에 따라 데이터를 정렬하지 않으며, 테이블의 데이터와 함께 index가 저장되는 것이 아니라 별도의 장소에 저장됩니다. 즉, 순서대로 정렬되어 있지 않습니다. 대표적인 예시로 책의 '찾아보기'나 '목차'를 생각하면 됩니다.
책의 마지막 페이지에 있는 '찾아보기'의 특정 단어와 함께 해당 단어가 있는 위치가 적혀 있는데, 우리는 단어가 있는 위치로 가서 어떤 내용인지 확인 할 수 있습니다.
아래와 같이, NonClusted Index는 데이터의 행에 독립적이며, 인덱스 키 값과 데이터 행을 가리키는 포인터가 존재합니다. 그리고 데이터의 행에 독립적이기 때문에 테이블 당 여러개의 인덱스를 생성할 수 있습니다.
추가로 UNIQUE 제약 조건이 있는 테이블을 만들면 데이터베이스 엔진에서는 자동으로 Non-Clustered Index를 만듭니다.
NonClustered Index는 다음과 같은 경우에 생성하는 것이 좋습니다.
- where절이나 Join 절과 같은 조건문을 활용하여 테이블을 필터링 하고자할 때
- 데이터가 자주 업데이트 될 때
- 특정 컬럼이 쿼리에서 자주사용 될 때
Clustered vs NonClustered Index
Clustered Index | Non-Clustered Index | |
테이블 당 index 갯수 | 1개 | 여러 개 |
저장 공간 | 테이블 내 한 Column을 index로 사용 | Index를 맵핑하기 위해 별도의 저장공간이 필요 |
검색 속도 | Non-Clustered Index 빠름 | Clustered Index보다 느림 (데이터를 찾는데 index를 확인하는 추가적인 스텝이 있기 때문) |
데이터 삽입 | 테이블의 순서가 정렬된 상태를 유지해야하기 때문에, 데이터가 중간에 삽입될 때 비용이 발생 | 별도의 공간에 인덱스를 생성해 관리하기 때문에 삽입 성능이 좋음 |
- Clustered 인덱스는 테이블당 오직 한개만 존재한다. 반면에 Non-Clustered 형은 테이블 당 여러개의 인덱스를 생성할 수 있다.
- Clustered 인덱스는 오직 테이블을 정렬한다. 그러므로 별도의 공간을 필요로하지 않는다. Non-Clustered 인덱스는 저장되는 별도의 공간(약 10%)이 필요하다.
- Clustered 인덱스는 통상적으로 데이터를 찾는데 추가적인 스텝을 거치지 않기 때문에 Non-Clustered 인덱스보다 속도가 빠르다.
- Clustered 인덱스는 데이터를 삽입할 때, 모든 테이블에 존재하는 데이터들의 순서를 유지해야하므로 많은 비용이 발생한다. Non-Clustered는 별도의 공간에 인덱스를 생성해야하기 때문에 추가작업이 필요하다.
ref
https://gwang920.github.io/database/clusterednonclustered/
https://velog.io/@gillog/SQL-Clustered-Index-Non-Clustered-Index
'개발 > DB' 카테고리의 다른 글
[Apache Pinot #1] Apache Pinot 소개 (0) | 2023.04.16 |
---|---|
Local Cache에 대하여 (Spring Cache, Caffeine/Ehcache, Redis Client-side caching..) (0) | 2022.09.01 |
SQL (RDBMS)과 NoSQL, ACID와 BASE (0) | 2022.08.11 |
CAP 정리와 PACELC 정리 (0) | 2022.08.10 |
[Redis] Redis Cluster의 기초 (0) | 2022.06.21 |
댓글