인덱스란?
인덱스는 추가적인 쓰기 작업과 저장 공간을 활용하여 테이블의 검색 속도를 향상시키기 위한 자료구조입니다.
예시를 들면 다음과 같은 멤버 테이블이 있다고 가정해보겠습니다.
a라는 칼럼이 '13' 이라는 값을 지니는 멤버를 찾으려면 모든 테이블을 다 뒤져야 찾을 수 있게 됩니다. 이것은 풀 테이블
스캔, 혹은 풀 스캔이라고 부릅니다. 만약 이를 인덱스를 사용하게 된다면,
a 칼럼의 모든 데이터들이 정렬된 상태로 새로운 저장소를 만들어 저장되게 됩니다. 물론 해당
값이 기존의 테이블에 어디에 위치해있는지 가리키는 포인터 또한 저장됩니다.
인덱스 테이블을 활용하여 a=13을 찾는다면 b-tree의 root부터 시작하여 13이 위치한 노드까지
binary search 방식을 활용하여 빠르게 찾아낼 수 있습니다!
인덱스의 장점
1. 조건(WHERE) 검색 효율성 향상
인덱스 테이블은 데이터들이 정렬되어 저장되기 때문에, 해당 조건에 맞는 데이터들을 빨리 찾아낼 수 있습니다.
2. 정렬(ORDER BY)의 효율성
기본적으로 ORDER BY는 굉장히 부하가 많이 걸리는 작업입니다. 정렬과 동시에 1차적으로
메모리에서 정렬이 이루어지고, 메모리보다 큰 작업이 필요하면 디스크 I/O도(HDD에 접근) 추가적으로 발생하게 됩니다.
하지만 인덱스를 사용한다면 이미 정렬된 상태이기 때문에 바로 가져오면 됩니다.
3. MIN, MAX의 효율적인 처리
데이터가 정렬되어 있기 때문에 MIN값과 MAX값은 각 테이블의 시작값과 끝값만 가져오면 됩니다.
인덱스의 단점
1. 데이터 추가 작업에 취약
INSERT, UPDATE, DELETE를 통해 데이터가 추가되거나 값이 바뀌면 인덱스 테이블 내에 있는 값들을
다시 정렬해야 합니다. 또한 인덱스는 테이블을 따로 두기 때문에 인덱스 테이블과 원본 테이블 두 군데를
수정작업 해줘야 하는 번거로움이 생깁니다. 때문에 인덱스는 변경이 빈번한 테이블 보다 검색을 위주로
하는 테이블에 인덱스를 하는 것이 좋습니다.
2. 추가적인 저장 공간 필요
앞에서 말했듯이 인덱스 작업은 인덱스 테이블이라는 저장공간을 따로 필요로 합니다. 이는 전체 데이터베이스의
약 10%에 해당하는 저장공간이 추가로 필요함을 의미합니다.
인덱스 전략
장점과 단점이 확실한 인덱스는 적절한 상황에 잘 사용해야 합니다.
다음과 같은 상황에 인덱스를 사용하면 좋습니다.
1. 높은 Cardinality
인덱스를 사용해야 되는 칼럼은 Cardinality가 높아야 합니다.
Cardinality는 유니크한 정도를 뜻한다고 생각하시면 됩니다.
지역과 성별 같이 중복 정도가 높은 칼럼은 카디널리티가 낮습니다.
반면에 주민번호나 계좌번호와 같이 중복 정도가 낮은 칼럼은 카디널리티가 높습니다.
db인덱스는 카디널리티가 높은 칼럼에 걸어야 합니다.
2. 데이터 조회가 많은 칼럼
데이터 변경 사항이 많은 칼럼에 인덱스를 걸면 안좋다고 위에서 말했습니다. 따라서 데이터 변경 가능성이 적은 칼럼이지만, 조회는 많이하는 칼럼에 인덱스를 걸어야 좋은 효과를 볼 수 있습니다.
이상으로 인덱스에 대해 살펴보았습니다.
읽어주셔서 감사합니다!
참고 자료
https://choicode.tistory.com/27
[DB] 데이터베이스(DB) 인덱스(Index) 란 무엇인가?
들어가면서.. DB를 사용하면서 데이터의 양(row)에 따라 실행 결과의 속도가 차이가 나는 것을 알고 있었다. 특히 데이터의 양이 증가할수록 실행 속도는 느려지고, JOIN이나 서브 쿼리 사용 시 곱
choicode.tistory.com
https://wildeveloperetrain.tistory.com/131
DB 데이터베이스 인덱스(Index) 기본 개념과 설명
1. 인덱스(Index)란? Index는 RDBMS(관계형 데이터베이스 관리 시스템)에서 테이블에 대한 검색 속도를 높여주는 자료 구조를 말하며, 테이블 내에 1개의 컬럼 혹은 여러 개의 컬럼을 이용하여 생성합
wildeveloperetrain.tistory.com
https://www.youtube.com/watch?v=IMDH4iAQ6zM
'DB' 카테고리의 다른 글
DB 쿼리 성능을 개선해보자 (0) | 2023.04.05 |
---|---|
식별관계와 비식별관계 (0) | 2023.03.28 |
Transaction(트랜잭션)이란 (0) | 2023.01.01 |
DB 커넥션을 반드시 close 해야하는 이유 (0) | 2022.08.01 |
JDBC에 관하여 (0) | 2022.07.29 |