Index
특정 데이터를 찾아내기 위해서는 전체 데이터를 다 훑어봐야 하는데
그 과정을 빠르게 하기 위해 Index라는 자료구조를 거쳐서 검색을 함
다시말해, Index는 데이터베이스 테이블의 검색 속도를 향상하기 위한 자료구조로
데이터베이스 데이터 조회 성능 향상을 위해 사용함
특정 컬럼(column)에 인덱스를 생성하면,
해당 컬럼의 데이터들을 오름차순으로 정렬하여 별도의 메모리 공간에
데이터의 물리적 주소와 함께 저장되는데,
책으로 가정하면 아래와 같이 표현 할 수 있음
데이터 = 내용
인덱스 = 목차
물리적 주소 = 페이지 번호
장점 +
데이터가 정렬되어 있기 때문에 테이블에서 검색과 정렬 속도를 향상시킴
- 조건 검색 Where절의 효율성 : 보통 Where절의 사용할 때 특정 조건에 맞는 데이터를 찾기 위해
데이터를 처음부터 끝까지 다 비교해야 하는데, 인덱스를 통해 데이터가 정렬되어 있으면 빠르게 찾아낼 수 있음 - 정렬 Order by 정의 효율성 : 인덱스를 사용하면 Order by에 의한 Sort과정을 피할 수 있다.
본래 Order by는 괴장히 부하가 많이 걸리는 작업이기 때문에 인덱스를 통해 이미 정렬되어 있으면 부하가 걸리지 않을 수 있음 - MIN, MAX의 효율적인 처리가 가능 : 이것또한 인덱스를 통해 데이터가 정렬되어 있기 때문에
처음부터 끝까지 뒤져서 찾는 것이 아닌 인덱스로 정렬된 데이터에서 MIN, MAX를 효율적으로 추출할 수 있음
단점 -
정렬된 상태를 계속 유지시켜줘야하기에 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 부작용이 발생
- DML에 취약 : INSERT, UPDATE, DELETE를 통해 데이터가 추가되거나 값이 바뀐다면
인덱스 테이블 내에 있는 값들을 다시 정렬을 해야함
DML이 빈번한 테이블에 인덱스를 생성하지 않는 것이 좋음 - 인덱스 생성 고려 : 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
인덱스는 성능향상을 위해 많이 사용되지만,
분명한 단점들이 존재하기에 상황에 맞게 사용해야한다는 것을 인지해야 함
인덱스는 여러 자료구조를 이용해서 구현 할 수 있는데, 대표적인 자료구조로 Hash Table 과 B+Tree 가 있음
Hash Table
컬럼의 값과 물리적 주소를 key와 value를 한 쌍으로 저장하는 자료구조
key값을 이용해 대응되는 value값을 구하는 방식임
실제로 인덱스에서 잘 사용하지 않음
모든 요소들을 하나씩 탐색해야하는 배열과는 달리
key를 통해 데이터를 바로 알아낼 수 있어 저장/읽기 속도가 빨라진다는 장점이 있지만,
저장 공간이 많이 필요하고, 데이터 공간을 작게 잡으면 충돌이 발생(해시 충돌) 할 수 있다는 단점이 있음
- 검색이 많이 필요한 경우
- 저장,삭제,읽기가 빈번한 경우
- 캐쉬 구현시(빠른 중복 체크를 위해)
B+Tree
밸런스 트리 ?
Balanced Tree
트리의 노드가 한 방향으로 쏠리지 않도록, 노드 삽입 및 삭제 시 특정 규칙에 맞게
재정렬되어 왼쪽과 오른쪽 자식 양쪽 수의 밸런스를 유지하는 트리로, 대표적으로 B-Tree가 있음
기존의 B-Tree는 어느 한 데이터의 검색은 효율적이지만,
모든 데이터를 한 번 순회하는 데에는 트리의 모든 노드를 방문해야 하므로 이러한 단점을 개선시킨 자료구조가 B+Tree임
Reference Path
'CS' 카테고리의 다른 글
Hash / Hash Table (0) | 2022.12.10 |
---|---|
Primary Index / Secondary Index / Composite Index (0) | 2022.12.03 |
마이크로서비스 아키텍처와 모놀리식 아키텍처 (0) | 2022.11.27 |
비즈니스 로직 Business Logic (0) | 2022.11.27 |
Blocking, NonBlocking + Synchronous, Asynchronous (0) | 2022.11.24 |