Database · Backend
무스키마 - ALTER가 없어도 마이그레이션은 남는다
스키마 없는 저장소에서 구조를 바꾸면 잠금은 사라진다. 그런데 채우는 일과 옛 모양은 그대로 남는다.
멈추지 않고 스키마를 바꾼다 6편
Database · Backend
헐어버린 벽 - 되돌릴 수 있는 변경만 한다
롤백 버튼이 못 하는 일이 있다. 어떤 변경이 한 방향인지 가려내고, 그 지점을 어떻게 뒤로 미루나.
멈추지 않고 스키마를 바꾼다 5편
Database · Backend
마이그레이션 도구 - 공사 기록부가 하는 일
버전 표 하나로 무엇이 풀리고 무엇이 안 풀리나. 체크섬, 동시 실행, 반쪽 적용, 그리고 되돌리기 스크립트의 허상.
멈추지 않고 스키마를 바꾼다 4편
Database · Backend
백필 - 이미 쌓인 5천만 행을 채운다
새 컬럼을 만들면 기존 행은 전부 비어 있다. 한 번에 채우면 왜 안 되고, 끊어 채우면 무엇을 더 챙겨야 하나.
멈추지 않고 스키마를 바꾼다 3편
Database · Backend
ALTER TABLE - 컬럼 하나 더하는 데 테이블이 멈춘다
추가만 하는 변경이 왜 서비스를 세우는가. 앞사람을 기다리는 줄, 테이블 재작성, 그리고 온라인 DDL의 값.
멈추지 않고 스키마를 바꾼다 2편
Database · Backend
스키마 변경 - 코드는 되돌아가고 데이터는 안 돌아간다
배포는 한 번에 되돌아가는데 스키마는 왜 안 되는가. 이 시리즈가 무엇을 맡고 무엇을 맡지 않는지부터.
멈추지 않고 스키마를 바꾼다 1편
Backend · Search
검색엔진을 들일 때 - DB로 버틸 수 있는 선
검색이 느리다고 바로 엔진을 들이면 저장소가 둘이 되고 동기화라는 새 일이 생긴다. DB로 어디까지 버틸 수 있고, 무엇을 보고 넘어갈지 판단표로 닫는다.
검색이 빠른 이유 6편
Backend · Search
색인은 늦게 따라온다 - 방금 쓴 글이 안 보이는 이유
글을 저장하고 바로 검색했는데 안 나온다. 버그가 아니라 역색인이라는 구조가 원래 그렇게 생겼다. 왜 바로 못 넣는지, 그 지연을 어디까지 줄일 수 있는지 본다.
검색이 빠른 이유 5편
Backend · Search
역색인 - 문서에서 낱말이 아니라 낱말에서 문서로
검색이 빠른 이유는 결국 아이디어 하나다. 문서를 열어 낱말을 찾는 대신, 낱말마다 그 낱말이 든 문서 번호를 미리 적어 둔다. 책 뒤의 찾아보기와 정확히 같은 구조다.
검색이 빠른 이유 2편
Backend · Search
LIKE '%검색어%' - 인덱스가 있어도 다 훑는다
검색창을 붙이고 LIKE로 막았다. 인덱스도 만들어뒀는데 데이터가 늘자 느려진다. 인덱스가 게을러서가 아니라, DB 인덱스와 본문 검색이 애초에 다른 일을 하기 때문이다.
검색이 빠른 이유 1편
CS · Time
팻말 없는 시각 - 저장할 때 무엇이 빠지나
DB 컬럼 타입을 고르는 순간 이 값이 순간인지 달력 시각인지가 정해진다. 이름이 비슷해 헷갈리는데, 한쪽은 쓰고 읽는 사이에 값이 조용히 바뀌고 다른 쪽은 안 바뀐다.
시간이라는 데이터 6편
Connection Pooling · Database
Connection Pooling
스레드가 DB를 부르려면 연결이 필요한데, 연결은 만드는 것도 무제한도 비싸다. 미리 열어 재사용하되, 연결은 DB가 상한을 정하는 자원이다.
동시성과 자원 풀링 3편
Pagination · Database
Pagination
100만 건을 한 번에 줄 순 없다. 나눠 주는 두 방법 - offset과 cursor, 그리고 왜 offset이 뒤로 갈수록 느려지고 밀리는가.
Database · Storage
B-tree와 LSM-tree - 읽기와 쓰기 중 무엇을 팔 것인가
8바이트를 바꾸려고 8KB를 다시 쓴다. 그게 싫으면 뒤집으면 되는데, 그러면 읽기가 대가를 낸다.
데이터베이스 공통 개념 14편
Database · NoSQL
NoSQL - 조립을 언제 하느냐의 문제다
SQL을 안 쓴다는 뜻이 아니다. 사실을 쪼개 두고 읽을 때 붙일 것인가, 읽을 모양대로 미리 붙여 둘 것인가. 그 하나에서 이득도 대가도 전부 나온다.
데이터베이스 공통 개념 13편
Database · Scaling
복제 - 방금 쓴 걸 왜 못 읽는가
읽기를 늘리려고 복제했더니 시간이 뒤엉킨다. 그리고 격리 수준은 이걸 막아주지 않는다.
데이터베이스 공통 개념 12편
Database · Scaling
파티셔닝과 샤딩 - 나누면 무엇을 잃는가
둘의 경계는 '누가 조각을 아는가'다. 그리고 샤딩하는 순간 지금까지의 트랜잭션 이야기가 대부분 무효가 된다.
데이터베이스 공통 개념 11편
Database · Design
키 설계 - 무엇으로 행을 가리킬 것인가
자연키가 배신하는 순간, 대리키를 쓰면서 흔히 빠뜨리는 것, 그리고 UUID가 인덱스를 망가뜨리는 이유.
데이터베이스 공통 개념 10편
Database · Design
정규화 - 한 테이블은 한 가지 사실만 말한다
정규형을 외우지 않고도 판단하는 법, 그리고 반정규화가 실제로 무엇을 사고파는 거래인지.
데이터베이스 공통 개념 9편
Database · Performance
실행 계획 - 세 가지만 보면 된다
EXPLAIN 출력이 외계어처럼 보일 때. 트리를 어느 방향으로 읽고, 어디서 범인을 찾는가.
데이터베이스 공통 개념 8편
Database · Join
조인 알고리즘 - DB는 세 가지 방법 중 하나를 고른다
중첩 반복·해시·정렬 병합이 각각 언제 이기는지, 그리고 조인이 갑자기 느려지는 진짜 이유.
데이터베이스 공통 개념 7편
Database · Index
인덱스 - 왜 빠르고, 왜 만들어도 안 타는가
B-tree가 이진트리가 아닌 이유부터, 인덱스를 만들어놓고도 풀스캔이 도는 다섯 가지 경우까지.
데이터베이스 공통 개념 6편
Database · Storage
블록 - DB는 바이트를 모른다
4바이트를 읽으려고 8KB를 읽는다. 낭비처럼 보이는 이 단위가 뒤에 나올 거의 모든 것의 바닥이다.
데이터베이스 공통 개념 5편
Database · Transaction
MVCC - 잠그는 대신 버전을 쌓는다
읽기가 쓰기를 막지 않게 만든 대가로 무엇을 떠안게 되는가. 버전 체인, 스냅샷, 그리고 청소 문제.
데이터베이스 공통 개념 4편
Database · Transaction
락과 데드락 - 잠가서 지키는 방식의 대가
공유락·배타락에서 2단계 잠금까지, 그리고 두 트랜잭션이 서로를 영원히 기다리게 되는 과정.
데이터베이스 공통 개념 3편
Database · Transaction
격리 수준 - 같이 읽고 쓰면 무엇이 깨지는가
더티 리드·반복 불가능 읽기·팬텀 리드가 언제 생기는지, 그리고 격리 수준이라는 이름이 왜 믿을 게 못 되는지.
데이터베이스 공통 개념 2편
Database · Transaction
트랜잭션과 ACID - 네 글자의 무게가 다르다
원자성·일관성·격리성·지속성이 각각 무엇을 보장하는지, 그리고 왜 넷 중 하나만 협상 대상인지.
데이터베이스 공통 개념 1편