우아한테크코스 테코톡
줄리의 스토리지 엔진과 MySQL
https://youtu.be/1v-V8GAHf3o?si=l6SgrGVfJOoXdkF2
줄리의 스토리지 엔진과 MySQL
- 줄리의 스토리지 엔진과 MySQL
- 스토리지 엔진의 핵심 자료구조
- B-tree 구조
- LSM-tree 구조
- B-tree vs LSM-tree 비교
- MySQL 주요 스토리지 엔진
- MyISAM 특징
- InnoDB 특징
- 실제 서비스 관점에서 중요한 이유
- 정리
MySQL 스토리지 엔진이란 무엇인가
MySQL을 사용할 때 우리는 보통 이렇게 생각한다.
SELECT * FROM users;
쿼리를 실행하면 MySQL이 모든 작업을 직접 처리한다고 느끼기 쉽다. 하지만 실제 DBMS 내부에는 수많은 컴포넌트가 존재하며, 그중 실제로 데이터를 저장하고 읽고 쓰는 핵심 역할을 담당하는 것이 바로 스토리지 엔진(Storage Engine) 이다.
즉 MySQL은 요청을 해석하고 관리하지만, 실제 데이터 I/O 작업은 스토리지 엔진이 수행한다.
DBMS 내부 구조와 스토리지 엔진의 위치
DBMS 내부에는 다음과 같은 다양한 컴포넌트가 존재한다.
Parser
Optimizer
Query Cache
Buffer Pool
Storage Engine
개발자가 SQL을 실행하면 MySQL은 이를 분석한 뒤, 최종적으로 스토리지 엔진에게 실제 데이터 작업을 요청한다.
개발자
→ MySQL
→ Storage Engine
→ Disk I/O
즉 스토리지 엔진은 데이터를 실제로 관리하는 데이터 관리자 역할을 한다.
스토리지 엔진의 핵심 역할
스토리지 엔진은 단순 저장소가 아니다. 데이터 저장 전략 자체를 결정하는 핵심 컴포넌트다.
대표 역할은 다음과 같다.
1. 데이터 저장 구조 결정
어떤 자료구조를 사용할 것인가?
예를 들면:
- B-tree
- LSM-tree
같은 구조를 선택한다.
2. 인덱스 관리
인덱스를 어떻게 구성할 것인가?
검색 속도와 성능은 대부분 인덱스 전략에 따라 달라진다.
3. 읽기/쓰기 처리
실제 디스크 I/O 작업을 담당한다.
SELECT → 읽기
INSERT → 쓰기
UPDATE → 수정
DELETE → 삭제
모두 스토리지 엔진이 수행한다.
왜 스토리지 엔진이 여러 개일까
MySQL에는 다양한 스토리지 엔진이 존재한다.
예를 들면:
- InnoDB
- MyISAM
- RocksDB
- WiredTiger
등이 있다.
이렇게 다양한 엔진이 존재하는 이유는 현대 시스템의 데이터 처리 요구사항이 매우 다양하기 때문이다.
현대 시스템의 데이터 처리 특징
오늘날 시스템은 다음과 같은 요구사항을 가진다.
대용량 읽기
검색 시스템
통계 시스템
리포트 시스템
대용량 쓰기
로그 수집
실시간 이벤트 저장
스트리밍 데이터 처리
높은 동시성
수천~수만 사용자 동시 요청
빠른 업데이트
실시간 상태 변경
즉 하나의 자료구조만으로 모든 상황을 최적화하기 어렵다.
그래서 상황별로 최적화된 스토리지 엔진들이 등장하게 되었다.
스토리지 엔진의 핵심 자료구조
현재 대부분의 스토리지 엔진은 크게 두 가지 자료구조를 사용한다.
B-tree
LSM-tree
B-tree 구조
B-tree란
B-tree는 데이터를 정렬된 트리 형태로 저장하는 구조다.
MySQL의 InnoDB와 MyISAM도 기본적으로 B-tree 기반 인덱스를 사용한다.
구조를 단순화하면 다음과 같다.
[M]
/ \
[G] [T]
검색 시 특정 구간을 따라 내려가며 탐색한다.
B-tree 검색 과정 예시
예를 들어 "Kim" 을 찾는다고 해보자.
Kim < Mozart
→ 왼쪽 노드 이동
Kim > Gold
→ 오른쪽 노드 이동
이런 식으로 트리를 탐색해 데이터를 찾는다.
B-tree의 장점
읽기 성능이 매우 좋다
트리 구조를 통해 빠르게 탐색 가능하다.
O(log N)
범위 검색에 강하다
WHERE created_at BETWEEN ...
ORDER BY ...
같은 범위 탐색이 효율적이다.
B-tree의 단점
쓰기 시에도 트리 탐색 및 재정렬이 필요하다.
즉 쓰기량이 많아질수록 성능 부담이 커질 수 있다.
INSERT 증가
→ 노드 분할
→ 페이지 재정렬
→ 디스크 I/O 증가
LSM-tree 구조
LSM-tree란
LSM-tree는 Log-Structured Merge Tree 의 약자다.
핵심 아이디어는 단순하다.
기존 데이터를 수정하지 말고
새로운 데이터를 계속 이어붙이자
즉 로그를 쌓듯 데이터를 기록한다.
LSM-tree 저장 방식
1단계: MemTable 저장
먼저 메모리의 MemTable에 데이터를 정렬 저장한다.
Memory
└── MemTable
2단계: Flush
MemTable이 가득 차면 디스크로 flush된다.
3단계: SSTable 생성
디스크에는 SSTable이라는 불변 파일로 저장된다.
Disk
├── SSTable1
├── SSTable2
└── SSTable3
LSM-tree 업데이트 특징
LSM-tree는 기존 데이터를 직접 수정하지 않는다.
예를 들어:
12 → Blue
가 저장되어 있는데,
12 → Green
이 들어오면 기존 값을 수정하는 대신 새로운 기록을 추가한다.
즉:
Append Only
방식으로 동작한다.
B-tree vs LSM-tree 비교
| 항목 | B-tree | LSM-tree |
|---|---|---|
| 읽기 성능 | 매우 좋음 | 상대적으로 느림 |
| 쓰기 성능 | 쓰기 많아지면 부담 | 매우 강력 |
| 범위 검색 | 강함 | 약함 |
| 업데이트 방식 | 직접 수정 | Append 방식 |
| 대표 사용처 | RDBMS | NoSQL/로그 시스템 |
B-tree가 유리한 상황
조회 중심 서비스
검색 시스템
정렬/범위 탐색 많은 서비스
LSM-tree가 유리한 상황
로그 수집
대규모 이벤트 저장
쓰기 중심 시스템
MySQL 주요 스토리지 엔진
MySQL에서 가장 많이 사용되는 엔진은 다음 두 가지다.
MyISAM
InnoDB
MyISAM 특징
과거 MySQL 5.5 이전 기본 엔진이었다.
특징은 다음과 같다.
장점
읽기 성능이 빠름
단순 읽기 작업은 성능이 좋았다.
단점
트랜잭션 미지원
BEGIN
COMMIT
ROLLBACK
같은 ACID 작업이 불가능했다.
외래키 미지원
참조 무결성을 보장하지 못했다.
테이블 락 사용
쓰기 시 테이블 전체를 잠갔다.
한 명 UPDATE
→ 전체 테이블 잠금
즉 동시성이 매우 낮았다.
InnoDB 특징
MySQL 5.5 이후 기본 스토리지 엔진이다.
현재 사실상 MySQL 표준 엔진이라고 볼 수 있다.
InnoDB의 핵심 장점
트랜잭션 지원
ACID 보장 가능하다.
BEGIN
COMMIT
ROLLBACK
외래키 지원
참조 무결성을 보장할 수 있다.
Row-Level Lock
행 단위 락을 사용한다.
사용자 A row 수정
→ 해당 row만 잠금
즉 동시성이 매우 뛰어나다.
왜 InnoDB가 중요한가
현대 서비스는 대부분 동시성이 중요하다.
예를 들면:
- 결제 시스템
- 주문 시스템
- 채팅 시스템
- 실시간 서비스
이런 환경에서는 수많은 사용자가 동시에 데이터를 수정한다.
InnoDB의 Row-Level Lock은 이런 환경에서 매우 강력한 장점이 된다.
실제 서비스 관점에서 중요한 이유
스토리지 엔진은 단순 DB 내부 기술이 아니다.
서비스 성능과 직결된다.
예를 들어:
읽기 중심인가?
쓰기 중심인가?
동시성이 중요한가?
트랜잭션이 필요한가?
에 따라 적절한 엔진과 자료구조 선택이 달라진다.
정리
스토리지 엔진은 MySQL 내부에서 실제 데이터 저장과 I/O를 담당하는 핵심 컴포넌트다.
핵심 역할은 다음과 같다.
데이터 저장 구조 결정
인덱스 관리
읽기/쓰기 처리
대표 자료구조는:
B-tree
LSM-tree
이며 각각 읽기/쓰기 특성이 다르다.
또한 MySQL에서는 대표적으로:
MyISAM
InnoDB
를 사용하며, 현재는 트랜잭션과 동시성 처리에 강한 InnoDB가 기본 엔진으로 사용된다.
결국 스토리지 엔진은 단순 저장소가 아니라, 데이터베이스의 성능과 확장성을 결정하는 핵심 기술이라고 볼 수 있다.