인덱스란?
데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조로 저장되는 컬럼의 값을 사용하여 항상 정렬된 상태를 유지한다 (MySql InnoDB 기준)
값을 항상 정렬된 상태로 유지하는 이유는 B-Tree의 변형 구조인 B+Tree 자료구조를 통해 인덱스를 구현하기 때문이다
먼저 B-Tree의 구조를 알아보자
B-Tree
B-Tree는 균형 잡힌 트리 구조를 가지며, 데이터를 정렬된 상태로 유지하는 특징을 갖고 있다
B-Tree에서는 크게 3가지의 노드가 존재한다
- 루트 노드 (최상위)
- 리프 노드 (최하위)
- 브랜치 노드 (중간)
B-Tree는 모든 데이터를 순회하기 위해서 트리의 모든 노드를 방문해야 한다는 단점이 존재하다
그렇기에 이를 개선한 B+Tree가 인덱스의 자료구조로 채택되었다
B+Tree
B+Tree의 리프 노드에는 실제 데이터 레코드를 찾아가기 위한 주솟값을 갖고 있으며, 리프 노드끼리는 연결리스트로 구성되어 있다
데이터는 리프 노드에만 저장하고 비단말 노드(data를 갖고 있지 않고 key만 갖는 인덱스 노드)는 데이터로의 빠른 접근을 위한 인덱스의 역할만 한다
데이터는 리프 노드에만 저장되며, 모든 데이터를 순회하기 위해서는 리프 노드만 방문하면 되기에 순차적인 탐색에 더 효율적이다
인덱스 작동 원리
인덱스는 키와 포인터로 구성되어 있으며, 키는 데이터를 정렬하는 데 사용되고 포인터는 실제 데이터가 저장된 위치를 가르킨다
데이터베이스 엔진은 쿼리를 수행할 때 인덱스의 키를 사용하여 검색 범위를 빠르게 좁혀나가고, 해당하는 포인터를 통해 실제 데이터에 접근한다
이러한 과정은 데이터베이스 테이블의 전체를 스캔하는 것보다 훨씬 빠르게 동작한다
인덱스 최적화
인덱스는 데이터 검색 속도를 향상 시키지만, B+Tree 구조로 구현되어 있기에
데이터 삽입, 수정, 삭제 작업의 성능을 저하시킨다
따라서 적절한 인덱스 설계가 필요하다
자주 검색되는 컬럼, 조인에 사용되는 컬럼, 데이터의 분포가 균일한 컬럼에 인덱스를 생성하는 것이 좋다
반면 데이터 변경이 잦은 컬럼이나 데이터의 분포가 불균일한 컬럼에는 인덱스 생성을 피하는 것이 좋다
https://www.maeil-mail.kr/question/60
https://blog.algomaster.io/p/a-detailed-guide-on-database-indexes
'Computer Science > Database' 카테고리의 다른 글
Redis (2) | 2024.11.15 |
---|---|
저장 프로시저 (Stored PROCEDURE) (1) | 2024.11.13 |
SQL과 NoSQL (0) | 2024.11.11 |