대부분의 개발자들은 데이터베이스 엔진을 검은 상자로 취급합니다: 쿼리를 작성하고 데이터가 마법처럼 반환됩니다. 하지만 데이터가 수백만 개의 행으로 확장될 때, 그 데이터가 물리적 하드웨어에 어떻게 위치해 있는지 이해하는 것은 시스템을 구축하는 방식을 바꾸는 데 영향을 미칩니다.모든 데이터를 기본 데이터베이스 설정에 투입하면, 저장 비용이 결국 폭발적으로 증가하고 쿼리가 느려집니다.
스케일링되는 시스템을 구축하려면, 두 가지 완전히 대립하는 저장소 철학을 이해해야 합니다: 페이지 기반 트랜잭션 저장소 (InnoDB)와 스트림 기반 압축 저장소 (ARCHIVE), 그리고 이들이 테이블 파티셔닝을 통해 어떻게 연결되는지를 이해해야 합니다.
1. InnoDB 계층 구조 (바이트에서 테이블스페이스까지)
MySQL의 기본 엔진인 InnoDB는 속도, 다중 사용자 정확성, 그리고 무거운 읽기/쓰기 트래픽에 대해 설계되었습니다. 그것은 단순히 원시 텍스트 문자열을 파일에 추가하는 것이 아닙니다. 그것은 매우 체계적이고 엄격한 다층 구조를 통해 데이터를 관리합니다.
저장 스택
-
테이블 공간들: 이것은 가장 높은 논리적 컨테이너입니다. 현대 설정과 같은 것들을 켜면
innodb_file_per_table는 각각의 데이터베이스 테이블이 하드 드라이브에 자신만의 물리적.ibd파일을 가지게 됩니다. - 확장: 운영 체제의 파일 시스템이 테이블을 드라이브의 다른 물리적 섹터에 흩뿌리는 것을 방지하기 위해 InnoDB는 확장이라는 청크 단위의 공간을 할당합니다. 각 확장은 정확히 1 메가바이트입니다. 크기로 여러 연속된 페이지를 묶어서, 순차적인 데이터가 디스크에서 물리적으로 가까이 유지됩니다.
- 페이지: 페이지는 InnoDB가 실제로 작업하는 핵심 원자 단위입니다. 기본적으로 InnoDB 페이지는 정확히 16 Kilobytes입니다. InnoDB가 데이터를 읽거나 쓸 때마다전체 16KB 페이지를 서버의 RAM(버퍼 풀)으로 로드하되, 단일 행만 요청했더라도
- 행:이 구조의 절대적인 기초에는 개별 행들이 데이터 페이지 내에 밀접하게 패킹되어 있습니다. InnoDB는 클러스터 인덱스 B+트리를 사용하므로, 행들은 물리적으로 주 키에 따라 정렬되어 디스크에 저장됩니다.
2. 아카이브 엔진 (반 페이지 접근 방식)
데이터를 업데이트할 필요가 없다면 어떡할까요? 시스템 로그, 클릭스트림, 또는 문제가 발생했을 때만 확인하는 수십억 개의 감사 추적을 저장한다면 어떡할까요?
이를 InnoDB에 넣는 것은 인덱스 트리와 16KB 페이지 구조 때문에 매우 비효율적입니다. The ARCHIVE 엔진는 InnoDB의 설계를 완전히 뒤집어서 이 정확한 문제를 해결합니다:
-
고정 페이지 없음: 16KB 블록으로 데이터를 엄격하게 구조화하는 대신, ARCHIVE는 데이터를 연속적이고 제한 없는 추가 전용 이진 바이트 스트림로 취급하고 이를
.arz파일 내에 저장합니다. -
실시간 스트림 압축: 데이터가 삽입될 때, 메모리 내 압축 버퍼를 통해 지나간다. 끝 공백은 제거되고, 최적화된 비트-헤더는
NULL값을 처리한다. 그런 다음 원시 행(row)들은 디스크에 저장되기 전에zlib알고리즘을 사용하여 실시간으로 압축된다. -
인덱스의 트레이드오프: 아키텍처의 작은 크기를 유지하기 위해, ARCHIVE는 초차 인덱스를 허용하지 않는다허용될 수 있는 인덱스는 하나뿐입니다.
AUTO_INCREMENT컬럼.
문자열의 원시 압축 문자열로서 작동하기 때문에 인덱싱된 블록 구조가 아니라, ARCHIVE는 일반적으로 달성합니다3:1에서 10:1 압축 비율InnoDB와 비교했을 때.
3. 아키텍처 비교 매트릭스
| 건축적 특징 | InnoDB 엔진 | 아카이브 엔진 |
|---|---|---|
| 저장 레이아웃 | 엄격한 16KB 페이지 / 1MB 확장 | 연속적 zlib압축된 바이트 스트림 |
| 주요 파일 형식 |
.ibd (데이터 + 인덱스 결합) |
.arz (데이터) + .frm (메타데이터) |
| 쓰기 모델 | B+트리 삽입, 페이지 분할 | 메모리 버퍼를 통한 오직 추가만 가능한 스트림 |
| 지원되는 변형 |
INSERT, SELECT, UPDATE, DELETE
|
INSERT, SELECT만 (WORM 모델) |
| 락 메커니즘 | 미세한 행 락 (MVCC) | 겹쳐진 행 스트림 락 |
4. 세계를 연결하기: 테이블 파티셔닝& 교환
두 엔진을 이해했다면, 이러한 심리적 모델을 Hot/Cold 데이터 티어링 시스템으로 결합할 수 있습니다. 목표는 간단합니다: 최신 데이터(Hot)를 InnoDB에 유지하여 빠르게 업데이트하고 인덱싱할 수 있도록 합니다. 오래된 데이터(Cold)를 대체 저장소로 이동시켜 디스크 공간을 덜 차지하도록 합니다.
MySQL는 단일 파티션된 테이블 내에서 저장 엔진을 혼합할 수 없으므로, 우리는 파티션 교환이라는 전략을 사용합니다. 이는 메타데이터만 교환하여 초 이내에 수백만 개의 행을 전송하는 것입니다.
단계 A: 파티션된 InnoDB 테이블 만들기
우리는 타임스탬프 또는 날짜를 사용하여 활성 InnoDB 테이블을 월별로 파티션합니다.
CREATE TABLE system_logs (
log_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
log_date DATE NOT NULL,
subsystem VARCHAR(50) NOT NULL,
message TEXT NOT NULL,
PRIMARY KEY (log_id, log_date)
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(log_date)) (
PARTITION p_past_month VALUES LESS THAN (TO_DAYS('2026-05-01')),
PARTITION p_current_month VALUES LESS THAN (TO_DAYS('2026-06-01')),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
단계 B: 즉시 파티션 교환
한 달이 끝나면 그 오래된 데이터를 압축하고 싶습니다. 대규모 DELETE 문장을 실행하면 테이블이 잠겨서 CPU 사용량이 폭증할 수 있습니다. 대신 비어 있는 동일한 InnoDB 전시 테이블을 만들고, 빠르게 오래된 파티션을 교체합니다:
-- 1. Create a temporary staging table matching the schema
CREATE TABLE system_logs_stage LIKE system_logs;
ALTER TABLE system_logs_stage REMOVE PARTITIONING;
-- 2. Instantly swap the old partition into the staging table (Takes < 1 second)
ALTER TABLE system_logs EXCHANGE PARTITION p_past_month WITH TABLE system_logs_stage;
-- 3. Drop the now empty partition from the active table
ALTER TABLE system_logs DROP PARTITION p_past_month;
여기서는 system_logs_stage의 내용을 직접 ARCHIVE 지원 테이블에 파이프하여 차가운 로그를 데이터베이스 내에서 자연스럽게 압축할 수 있습니다.
5. 생산 현실 점검: 현재 산업의 상태
파티션 교환(Partition Exchange)이 실제로 생산 환경에서 사용되나요? 네, 매일매일 사용됩니다. 실시간 테이블을 락하지 않고 역사적 데이터를 삭제하거나 분리하는 골드 스탠더드입니다.
그러나, ARCHIVE 엔진이 스트림 압축을 위한 멋진 아키텍처 블루프린트일지라도, 현대 클라우드 인프라 팀들은 "차가운" 계층화를 다르게 처리하는 경우가 많습니다. 오늘날, 생산 데이터베이스 저장소와 IOPS(초당 입력/출력 작업 수)는 매우 비쌉니다. 엔지니어들은 압축되었더라도 차가운, 역사적인 로그 데이터가 동일한 생산 데이터베이스 인스턴스에 있기를 원하지 않습니다.
대신, 회사들은 Partition Exchange를 사용하여 오래된 데이터를 스테이징 테이블로 분리하고, MySQL에서 완전히 스트리밍하여 클라우드 데이터 라이크(AWS S3와 같은)에 초고압축 열 형식의 Apache Parquet 파일로 저장한 다음, 스테이징 테이블을 완전히 삭제합니다. 이는 실시간 운영 데이터베이스를 가볍고 빠르게 유지하며, 운영 비용도 매우 저렴하게 만듭니다.
결론
사이드 프로젝트를 만들거나 소프트웨어 공학 과정을 공부할 때는 표준 데이터베이스 구성을 기본으로 설정하는 것이 쉽습니다. 하지만 엔진을 들여다보는 것은 애플리케이션 성능에 대한 접근 방식을 바꿉니다.
InnoDB의 단일 페이지 할당과 ARCHIVE의 유연한 압축 스트림 간의 긴장을 이해하면 데이터 접근 패턴을 비판적으로 생각할 수 있습니다 - 올바른 저장 전략을 올바른 작업 부하에 맞게 매칭하는 것이 표준 CRUD 앱을 작성하는 것에서 최적화된, 생산 준비 시스템을 공학하는 데로 나아가는 방법입니다.












