본문 바로가기
Boaz/Computer Science

[CS 전공지식 #15] 챕터4-4~5. 데이터베이스의 종류와 인덱스

by 남디윤 2025. 2. 24.

 

목차

4.4 데이터베이스의 종류

4.4.1 관계형 데이터베이스

4.4.2 NoSQL 데이터베이스

4.5 인덱스

4.5.1 인덱스의 필요성

4.5.2 B-트리

4.5.3 인덱스 만드는 방법

4.5.4 인덱스 최적화 기법

 

챕터4. 데이터베이스

 

4.4 데이터베이스의 종류

 

4.4.1 관계형 데이터베이스

  • 관계형 데이터베이스 RDBMS
    • 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스
    • SQL을 써서 조작. 각각의 제품에 특화시킨 SQL 사용
  • MySQL
    • 대부분의 운영체제와 호환 가능, 가장 많이 사용되는 데이터베이스
    • 스토리지 엔진: 모듈식 아키텍처로 쉽게 교체 가능
    • 데이터 웨어하우징, 트랜잭션 처리, 고가용성 처리에 강점
    • 스토리지 엔진 위에는 커넥터 API 및 서비스 계층을 통해 MySQL 데이터베이스와 쉽게 상호작용 가능
    • 쿼리 캐시 지원
      • 입력된 쿼리 문에 대한 전체 결과 집합 저장
      • → 사용자가 작성한 쿼리가 캐시에 있는 쿼리와 동일 → 구문 분석, 최적화 및 실행 건너뛰고 캐시의 출력만 표시

Image

  • PostgreSQL
    • MySQL 다음으로 개발자들이 선호하는 데이터베이스 기술
    • 디스크 조각이 차지는 영역을 회수할 수 있는 장치인 VACUUM이 특징
    • SQL 뿐만 아니라 JSON을 이용해서 데이터 접근 가능
    • 지정 시간에 복구하는 기능, 로깅, 접근 제어, 중첩된 트랜잭션, 백업 등 가능

 

4.4.2 NoSQL 데이터베이스

  • NoSQL Not only SQL 슬로건
  • 대표적으로 MongoDB와 redis 등
  • MongoDB
    • JSON을 통해 데이터 접근 가능 (Binary JSON 형태로 데이터 저장)
    • 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터 베이스
    • 확장성이 뛰어남, 빅데이터 저장 시 성능이 좋음
    • 고가용성과 샤딩, 레플리카셋 지원
    • 스키마 정해놓지 않고 데이터 삽입 가능 → 다양한 도메인의 데이터베이스를 기반으로 분석, 로깅 등을 구현할 때 강점
    • Object ID 생성
      • 도큐먼트 생성할 때마다 다른 컬렉션에서 중복된 값을 지니기 힘든 유니크한 값

Image

  • redis
    • 인메모리 데이터베이스
    • 키-값 데이터 모델 기반의 데이터베이스
    • 기본 데이터 타입 문자열 string, 최대 512MB까지 저장 가능
    • 셋 set, 해시 hash 등을 지원
    • pub/sub 기능을 통해 채팅 시스템, 캐싱 계층, 세션 정보 관리, 정렬된 셋 자료 구조를 이용한 실시간 순위표 서비스 등

 

4.5 인덱스

 

4.5.1 인덱스의 필요성

  • 인덱스: 데이터를 빠르게 찾을 수 있는 하나의 장치
  • 예) 책의 본문, “항목” 을 찾아보기를 통해 빠르게 찾기

 

4.5.2 B-트리

  • 인덱스는 보통 B-트리라는 자료 구조
  • 루트 노드, 리프 노드, 브랜치 노드(루트와 리프 노드 사이)
  • 예) E를 찾는다
    • 전체 테이블 탐색하는 것이 X → 5번 탐색
    • E 가 있을 법한 리프 노드로 들어가서 E를 탐색 → 2번 탐색

Image

  • 인덱스가 효율적인 이유
    • 균형 잡힌 트리구조와 트리 깊이의 대수확장성 때문
    • 대수확장성: 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것
    • 기본적으로 인덱스가 한 깊이씩 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가

 

4.5.3 인덱스 만드는 방법

  • 데이터베이스마다 다름
  • MySQL
    • 클러스터형 인덱스, 세컨더리 인덱스
    • 클러스터형 인덱스
      • primary key 옵션으로 기본 키 생성 → 클러스터형 인덱스
      • 기본키로 만들지 않고 unique not null 옵션 → 클러스터형 인덱스
      • 하나의 인덱스만 생성 시 클러스터형 인덱스가 세컨더리 인덱스보다 성능 좋음
    • 세컨더리 인덱스
      • create index 명령어 기반으로 생성 → 세컨더리 인덱스
      • 보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 하는 인덱스
      • 예)
        • age 하나의 필드만으로 쿼리 → 클러스터형 인덱스만 필요
        • age, name, email 등 다양한 필드 쿼리 → 세컨더리 인덱스
  • MongoDB
    • 도큐먼드 만들면 자동으로 ObjectID가 형성, 해당 키가 기본 키로 설정됨
    • 세컨더리키도 부가적으로 설정 → 기본키와 세컨더리키를 같이 쓰는 복합 인덱스 설정 가능

 

4.5.4 인덱스 최적화 기법

  • 데이터베이스마다 상이, 기본적인 골조 동일
  • 본 책 MongoDB를 기반으로 설명
  1. 인덱스는 비용이다.
    • 인덱스는 두 번 탐색하도록 강요함
    • 인덱스 리스트 → 컬렉션 순 탐색 : 읽기 비용 발생
    • 컬렉션 수정 시 인덱스도 수정 필요
      • = 책 본문 수정 시 목차도 수정 필요
      • B-트리 높이 균형 있게 조절하는 비용 발생 및 데이터 분산 비용 발생
      • → 쿼리에 있는 필드에 인덱스를 무작정 다 설정 X
    • 컬렉션에서 가져와야 하는 양이 많을수록 인덱스 사용하는 것은 비효율적
  2. 항상 테스팅하라
    • 서비스에서 사용하는 객체의 깊이, 테이블 양 등이 다르기 때문에 최적화 기법은 달라짐
    • → 항상 테스팅 하는 것이 중요
    • explain() 함수를 통해 인덱스를 생성
    • 쿼리를 보낸 이후에 테스팅 하며 걸리는 시간을 최소화

Image

  1. 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.
    • 보통 여러 필드 기반 조회 시 → 복합 인덱스 생성
    • 인덱스 생성 시 순서가 있고, 생성 순서에 따라 인덱스 성능이 달라짐
    • 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 함

Image