
오늘은 MySQL에서 제공하는 스토리지 엔진에 대해 알아보겠습니다. MySQL은 단순한 RDBMS를 넘어 다양한 용도에 맞게 데이터를 저장할 수 있도록 여러 가지 스토리지 엔진을 제공합니다. 이 중에서도 실제 서비스에서 자주 사용되거나 특정 목적에 특화된 4가지(InnoDB, MyISAM, MEMORY, ARCHIVE) 엔진을 중심으로 살펴보겠습니다.
InnoDB는 MySQL의 기본 엔진으로 트랜잭션 처리, 자동 복구 등의 기능을 제공하는 가장 범용적이고 안정적인 엔진입니다.
InnoDB는 테이블 전체가 아닌 레코드 단위로 잠금(Shared Lock or Exclusive Lock)을 수행합니다. 이에 따라, 여러 사용자가 동시에 같은 테이블에 접근해도 다른 레코드를 수정하는 경우 충돌이 발생하지 않습니다. 덕분에, 쓰기 작업이 많은 서비스에서도 높은 성능을 유지할 수 있습니다.
InnoDB는 Redo Log와 Undo Log를 통해 ACID의 원자성과 지속성을 보장합니다.
ROLLBACK 명령을 수행하면, 이 로그를 활용해 복원InnoDB는 위 두 로그를 활용해 장애 상황에서도 데이터 일관성을 유지하고, 정상적으로 커밋된 작업은 보존, 비정상 종료된 작업은 무효화할 수 있습니다.
START TRANSACTION;
-- 잔액 차감
-- -> Undo Log에 이전 balance 저장
UPDATE account SET balance = balance - 100 WHERE id = 1;
-- 성공 시 COMMIT → Redo Log 기록 -> 데이터 반영
-- 실패 시 ROLLBACK → Undo Log 조회 -> 이전 값 복원
InnoDB는 장애 발생 시 다음과 같은 방식으로 자동 복구를 수행합니다.
위와 같은 과정을 통해 시스템이 정상 종료되지 않았더라도 데이터를 완전한 상태로 복구할 수 있습니다.
InnoDB는 외래 키를 통해 참조 무결성을 보장하며, 연관된 테이블 간의 삭제/수정 제약도 함께 설정할 수 있습니다.
앞서 살펴본 InnoDB의 구조적 특징을 바탕으로, 다음과 같은 장점과 단점을 가집니다.
Shared Lock은 읽기 작업을 위한 락으로, 여러 트랜잭션이 동시에 동일한 데이터를 읽는 것을 허용합니다. 하지만, 쓰기 작업에 대한 트랜잭션은 대기해야 합니다. Exclusive Lock은 쓰기 작업을 위한 락으로, 락이 걸린 데이터에 대해 다른 트랜잭션이 읽거나 쓸 수 없습니다.
MySQL에서의 Exclusive Lock
MySQL의 경우 기본적으로 MVCC를 지원하고 있어 Exclusive Lock에서도 단순 SELECT는 가능하지만, 명시적으로 락을 요청하는 SELECT의 경우 불가합니다.
버퍼 풀은 디스크 I/O를 줄이기 위해 사용하는 메모리 캐시 영역입니다. 디스크에 저장된 테이블/인덱스 페이지를 한 번 읽어오면 메모리에 저장한 후, 이를 조회하거나 수정합니다.
MVCC는 다중 트랜잭션 환경에서 읽관된 읽기를 가능하게 하는 동시성 제어 방식입니다. 하나의 데이터에 대해 여러 버전을 관리함으로써, 쓰기와 읽기 충돌 없이 병행될 수 있도록 도와줍니다.
MyISAM은 InnoDB 이전에 MySQL의 기본 엔진으로, 구조가 단순하고 읽기 성능이 우수하다는 특징을 가집니다. 하지만, 트랜잭션이나 외래 키 같은 기능은 지원하지 않기 때문에 데이터 정합성과 동시성 처리에는 제한이 있습니다.
COMMIT, ROLLBACK 같은 트랜잭션과 외래 키 제약 조건을 지원하지 않습니다. 이에 따라, 트랜잭션 로그를 유지하지 않아 실행 경로가 단순해지고 속도는 빨라지지만, 데이터 정합성을 직접 관리해야 합니다.
데이터 수정 발생 시 테이블 전체에 락을 걸기 때문에, 다수의 쓰기 작업이 동시에 발생하면 병목 현상이 발생합니다.
데이터를 .MYD, 인덱스를 .MYI 파일로 분리해 저장합니다. 이에 따라, 단순 파일 복사만으로도 백업이 가능합니다. 또한, 고정 길이 레코드를 활용해 빠르게 위치를 계산할 수 있어 접근 속도가 빠릅니다.
Redo Log와 Undo Log를 기록하지 않기 때문에 자동 발생 시 자동 복구가 불가능합니다. 이에 따라, 데이터 손상이 발생하면 myisamchk 같은 수동 복구 도구로 직접 복구해야 합니다.
위와 같은 특징에 기반하여 다음과 같은 장점과 단점을 가지고 있습니다.
COUNT(*) 연산 시 테이블 전체를 스캔하지 않고 메타데이터로 즉시 응답.MYD)와 인덱스(.MYI) 파일만 복사하면 백업 가능