Dev/SQL

[MySQL] Index, Tree

syuare 2025. 4. 11. 22:45

2025.04.11 - [Dev/SQL] - [내일배움캠프][SQL] Lv1. 데이터 속 김서방 찾기

 

[내일배움캠프][SQL] Lv1. 데이터 속 김서방 찾기

Table - users > 스파르타 코딩클럽에 가입한 유저들의 정보를 날짜별로 기록한 테이블user_id: 익명화된 유저들의 아이디(varchar255)created_at: 아이디 생성 날짜(timestamp)updated_at: 정보 업데이트 날

syuare.tistory.com

SQL 달리기반 퀘스트를 진행 중에 여러 개념이 있길래 별도로 정리해보았다.


인덱스(Index)

데이터베이스 테이블에 있는 데이터를 빠르게 검색할 수 있도록 만들어진 자료구조

  • 조건에 맞는 레코드를 전체 테이블을 스캔하지 않고도 효과적으로 검색 가능
    • 예시) 책의 목차와 같은 느낌
  • 단, 적절한 인덱스 설계는 조회 성능 향상에 큰 도움이 되지만, 인덱스 관리에도 비용이 따르므로 상황에 맞게 선택하는 것이 중요하다.

동작 원리

인덱스는 일반적으로 B-트리 / B+트리 구조를 사용함

  • 정렬된 데이터 저장:
    • 인덱스는 특정 컬럼의 값을 정렬된 상태로 저장함
      • 예를 들어 "김%"와 같이 문자열의 시작 부분을 조건으로 검색할 때, 인덱스는 범위 검색(range scan)을 통해 필요한 데이터만 빠르게 찾아낼 수 있음
  • 포인터 역할:
    • 인덱스의 각 엔트리는 실제 테이블의 행에 대한 포인터(주소)를 포함함
      • 인덱스를 통해 특정 값의 위치를 찾은 후, 해당 포인터를 사용하여 실제 데이터를 읽어옴
  • 검색 시간 단축:
    • 인덱스가 있으면, 전체 테이블을 순차 탐색하는 대신 트리 구조를 따라 탐색하게 되므로 검색 시간이 로그 시간(logarithmic time)으로 단축


B-Tree / B+Tree

대용량 데이터베이스와 파일 시스템에서 사용

디스크 I/O를 최소화하면서 많은 데이터를 정렬된 상태로 저장하여 빠른 검색 및 범위 검색을 지원

B-Tree

  • 모든 노드(내부/리프)에 데이터가 저장됨.
  • 리프 노드들끼리는 연결되어 있지 않음.
  • 루트부터 탐색하면서 필요한 값을 찾음.
        [10 | 20]
       /    |    \
  [5]   [15]   [25 | 30]
-- 10, 20은 루트에 데이터로 직접 존재하고, 리프 노드들도 각각 데이터를 가짐.

B+Tree

  • 모든 데이터는 리프 노드에만 저장됨.
  • 내부 노드는 인덱스 역할만 함 (데이터 없음).
  • 리프 노드들끼리 연결 리스트처럼 연결되어 있음. → 범위 검색이 빠름 (예: WHERE age BETWEEN 20 AND 30)
        [10 | 20]
       /    |    \
  →[1|5][11|15][21|25|30]-- 루트(내부 노드)는 10, 20 기준값만 가지고 있고, 
-- 실제 데이터는 리프 노드에만 있음. 리프들은 오른쪽으로 쭉 연결되어 있음

B-Tree vs B+Tree

특성 B-트리 B+ 트리
데이터 저장 위치 내부 노드와 리프 노드 모두 데이터(키 및 값)를 저장 내부 노드에는 키만 저장하고, 실제 데이터는 모든 리프 노드에 저장
노드 연결 리프 노드 간 별도의 연결이 없는 경우가 일반적 리프 노드들이 연결 리스트로 서로 링크되어 있어 순차 검색이 용이
범위 검색 범위 검색은 가능하지만, 리프 노드가 연결되어 있지 않아 순차 접근이 덜 효율적일 수 있음 리프 노드가 연결되어 있어 범위 검색 및 정렬된 순서대로 데이터 접근에 유리
내부 노드 크기 최적화 키와 데이터를 모두 저장하므로, 노드 당 저장할 수 있는 항목 수가 상대적으로 줄어들 수 있음 내부 노드에는 키만 저장하므로, 한 노드에 더 많은 키를 저장할 수 있어 트리의 높이를 더 낮출 수 있음

트리(Tree)? 

루트(Root) 노드에서 시작해 계층적 관계를 갖는 노드들의 집합으로, 

사이클(cycle)이 없고 계층구조를 이루는 비선형 자료구조

  • 구조적 특성: 계층적인 데이터 표현과 비순환 구조 덕분에 각종 응용 분야에서 활용됨
  • 다양한 유형: 단순 이진 트리부터 균형 잡힌 트리, 힙, 트라이, B-트리 등 여러 형태로 구현되어 있음 
    • 상황에 맞게 선택 가능
  • 성능: 올바른 유형의 트리를 선택하면 검색, 삽입, 삭제 등 주요 연산의 효율을 크게 향상 시킬 수 있음