designing-data-intensive-applications

데이터베이스를 강력하게 만드는 데이터 구조

#!/bin/bash

db_set () {
  echo "$1,$2" >> database
}

db_get () {
  grep "^$1," database | sed -e "s/^$1,//" | tail -n 1
}
# grep은 database 파일에서 키를 포함한 line을 찾아서 반환
# sed -e는 문자열 편집, s 하위명령어("s/aaa/bbb/")는 aaa를 bbb로 치환

해시 색인

SS테이블과 LSM 트리

SS테이블 생성과 유지

SS테이블에서 LSM 트리 만들기

성능 최적화

B 트리

신뢰할 수 있는 B 트리 만들기

B 트리 최적화

B 트리와 LSM 트리 비교

기타 색인 구조

(이하부턴 대충대충 훑어만 봄)

색인 안에 값 저장하기

다중 칼럼 색인

모든 것을 메모리에 보관

(훑어만 본 구간 끝)

트랜잭션 처리나 분석?

특성 트랜잭션 처리 시스템(OLTP) 분석 시스템(OLAP)
주요 읽기 패턴 질의당 적은 수의 레코드, 키 기준으로 가져옴 많은 레코드에 대한 집계
주요 쓰기 패턴 임의 접근, 사용자 입력을 낮은 지연 시간으로 기록 대규모 불러오기(bulk import, ETL) 또는 이벤트 스트림
주요 사용처 웹 애플리케이션을 통한 최종 사용자/소비자 의사결정 지원을 위한 내부 분석가
데이터 표현 데이터의 최신 상태(현재 시점) 시간이 지나며 일어난 이벤트 이력
데이터셋 크기 GB~TB TB~PB

데이터 웨어하우징

분석용 스키마: 별 모양의 스키마와 눈꽃송이 모양 스키마

칼럼 지향 저장소

칼럼 압축

WHERE product_sk IN (30, 68, 69) -- 세 조건의 비트맵 3개를 적재하고 비트 OR을 계산
WHERE product_sk = 31 AND store_sk = 3 -- 두 조건의 비트맵을 적재하고 비트 AND를 계산

칼럼 저장소의 순서 정렬

칼럼 지향 저장소에 쓰기

집계: 데이터 큐브와 구체화 뷰

정리