목차
챕터4. 데이터베이스
4.4 데이터베이스의 종류
4.4.1 관계형 데이터베이스
- 관계형 데이터베이스 RDBMS
- 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스
- SQL을 써서 조작. 각각의 제품에 특화시킨 SQL 사용
- MySQL
- 대부분의 운영체제와 호환 가능, 가장 많이 사용되는 데이터베이스
- 스토리지 엔진: 모듈식 아키텍처로 쉽게 교체 가능
- 데이터 웨어하우징, 트랜잭션 처리, 고가용성 처리에 강점
- 스토리지 엔진 위에는 커넥터 API 및 서비스 계층을 통해 MySQL 데이터베이스와 쉽게 상호작용 가능
- 쿼리 캐시 지원
- 입력된 쿼리 문에 대한 전체 결과 집합 저장
- → 사용자가 작성한 쿼리가 캐시에 있는 쿼리와 동일 → 구문 분석, 최적화 및 실행 건너뛰고 캐시의 출력만 표시
- PostgreSQL
- MySQL 다음으로 개발자들이 선호하는 데이터베이스 기술
- 디스크 조각이 차지는 영역을 회수할 수 있는 장치인 VACUUM이 특징
- SQL 뿐만 아니라 JSON을 이용해서 데이터 접근 가능
- 지정 시간에 복구하는 기능, 로깅, 접근 제어, 중첩된 트랜잭션, 백업 등 가능
4.4.2 NoSQL 데이터베이스
- NoSQL Not only SQL 슬로건
- 대표적으로 MongoDB와 redis 등
- MongoDB
- JSON을 통해 데이터 접근 가능 (Binary JSON 형태로 데이터 저장)
- 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터 베이스
- 확장성이 뛰어남, 빅데이터 저장 시 성능이 좋음
- 고가용성과 샤딩, 레플리카셋 지원
- 스키마 정해놓지 않고 데이터 삽입 가능 → 다양한 도메인의 데이터베이스를 기반으로 분석, 로깅 등을 구현할 때 강점
- Object ID 생성
- 도큐먼트 생성할 때마다 다른 컬렉션에서 중복된 값을 지니기 힘든 유니크한 값
- redis
- 인메모리 데이터베이스
- 키-값 데이터 모델 기반의 데이터베이스
- 기본 데이터 타입 문자열 string, 최대 512MB까지 저장 가능
- 셋 set, 해시 hash 등을 지원
- pub/sub 기능을 통해 채팅 시스템, 캐싱 계층, 세션 정보 관리, 정렬된 셋 자료 구조를 이용한 실시간 순위표 서비스 등
4.5 인덱스
4.5.1 인덱스의 필요성
- 인덱스: 데이터를 빠르게 찾을 수 있는 하나의 장치
- 예) 책의 본문, “항목” 을 찾아보기를 통해 빠르게 찾기
4.5.2 B-트리
- 인덱스는 보통 B-트리라는 자료 구조
- 루트 노드, 리프 노드, 브랜치 노드(루트와 리프 노드 사이)
- 예) E를 찾는다
- 전체 테이블 탐색하는 것이 X → 5번 탐색
- E 가 있을 법한 리프 노드로 들어가서 E를 탐색 → 2번 탐색
- 인덱스가 효율적인 이유
- 균형 잡힌 트리구조와 트리 깊이의 대수확장성 때문
- 대수확장성: 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것
- 기본적으로 인덱스가 한 깊이씩 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가
4.5.3 인덱스 만드는 방법
- 데이터베이스마다 다름
- MySQL
- 클러스터형 인덱스, 세컨더리 인덱스
- 클러스터형 인덱스
- primary key 옵션으로 기본 키 생성 → 클러스터형 인덱스
- 기본키로 만들지 않고 unique not null 옵션 → 클러스터형 인덱스
- 하나의 인덱스만 생성 시 클러스터형 인덱스가 세컨더리 인덱스보다 성능 좋음
- 세컨더리 인덱스
- create index 명령어 기반으로 생성 → 세컨더리 인덱스
- 보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 하는 인덱스
- 예)
- age 하나의 필드만으로 쿼리 → 클러스터형 인덱스만 필요
- age, name, email 등 다양한 필드 쿼리 → 세컨더리 인덱스
- MongoDB
- 도큐먼드 만들면 자동으로 ObjectID가 형성, 해당 키가 기본 키로 설정됨
- 세컨더리키도 부가적으로 설정 → 기본키와 세컨더리키를 같이 쓰는 복합 인덱스 설정 가능
4.5.4 인덱스 최적화 기법
- 데이터베이스마다 상이, 기본적인 골조 동일
- 본 책 MongoDB를 기반으로 설명
- 인덱스는 비용이다.
- 인덱스는 두 번 탐색하도록 강요함
- 인덱스 리스트 → 컬렉션 순 탐색 : 읽기 비용 발생
- 컬렉션 수정 시 인덱스도 수정 필요
- = 책 본문 수정 시 목차도 수정 필요
- B-트리 높이 균형 있게 조절하는 비용 발생 및 데이터 분산 비용 발생
- → 쿼리에 있는 필드에 인덱스를 무작정 다 설정 X
- 컬렉션에서 가져와야 하는 양이 많을수록 인덱스 사용하는 것은 비효율적
- 항상 테스팅하라
- 서비스에서 사용하는 객체의 깊이, 테이블 양 등이 다르기 때문에 최적화 기법은 달라짐
- → 항상 테스팅 하는 것이 중요
- explain() 함수를 통해 인덱스를 생성
- 쿼리를 보낸 이후에 테스팅 하며 걸리는 시간을 최소화
- 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.
- 보통 여러 필드 기반 조회 시 → 복합 인덱스 생성
- 인덱스 생성 시 순서가 있고, 생성 순서에 따라 인덱스 성능이 달라짐
- 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 함
'Boaz > Computer Science' 카테고리의 다른 글
[CS 전공지식 #17] 챕터5. 자료 구조 (1) | 2025.04.16 |
---|---|
[CS 전공지식 #16] 챕터4-6~7. 조인과 조인의 원리 (0) | 2025.02.24 |
[CS 전공지식 #14] 챕터4-3. 트랜잭션과 무결정 (0) | 2025.02.24 |
[CS 전공지식 #13] 챕터4-2. ERD와 정규화 과정 (0) | 2025.02.24 |
[CS 전공지식 #12] 챕터4-1. 데이터베이스의 기본 (0) | 2025.02.24 |