이번 글에서는 제가 사용해 본 MySQL이라는 RDBMS와 MySQL의 엔진을 살펴볼 예정입니다.
MySQL
MySQL은 여러 RDBMS 중 하나입니다.
MySQL의 특징을 알아보겠습니다.
- 오픈 소스
- 오라클이 MySQL의 소유권을 가지게 되었지만, 여전히 GPL로 배포되며 오픈소스로 유지되고 있습니다.
- 빠른 성능
- 경량화된 아키텍처로 높은 성능을 제공합니다.
- 읽기/쓰기 작업이 빈번한 웹 애플리케이션에서 적합합니다.
- 다양한 플랫폼 지원
- Window, Mac, Linux 등 다양한 운영체제에서 사용 가능합니다.
- 스토리지 엔진 지원
- MySQL은 InnoDB, MyISAM, Memory등 여러 스토리지 엔진을 지원합니다.
MySQL의 엔진
MySQL에는 여러 가지 엔진이 존재합니다.
사용자들은 사용 목적과 요구사항에 따라 선택할 수 있고, 성능, 트랜잭션 처리, 데이터 무결성등의 특성에 따라 엔진을 고를 수 있습니다.
MySQL의 대표적인 엔진인 InnoDB에 대해 알아보도록 하겠습니다.
InnoDB
InnoDB는 MySQL의 기본 스토리지 엔진입니다.
InnoDB에는 다음과 같은 특징이 있습니다.
- 트랜잭션과 데이터 무결성을 지원하며, RDB의 핵심 요소인 ACID 속성을 충족합니다.
- 데이터를 클러스터링 인덱스 방식으로 저장하여, 기본키 검색 속도가 빠릅니다.
InnoDB에는 다음과 같은 장점이 있습니다.
- 트랜잭션이 필요한 복잡한 애플리케이션에 적합합니다.
- 행 기반 잠금(Row-Level Locking)을 사용해 동시성 처리 성능이 우수합니다.
- 시스템 장애 시 Redo 로그를 통해 데이터 복구가 가능합니다.
글을 적다보니 문득 궁금해지네요. 클러스터링 인덱스란 무엇일까요?
클러스터링 인덱스는 데이터베이스에서 테이블의 데이터가 기본키를 기준으로 물리적으로 정렬되어 저장되는 방식입니다.
다음과 같은 동작방식이 있습니다.
- 기본키를 기준으로 데이터 저장
- 클러스터링 인덱스를 사용하는 테이블에서는 기본키(PK)가 클러스터링 인덱스로 설정됩니다.
- 테이블의 데이터는 기본키 값에 따라 정렬되어 디스크에 저장됩니다.
- 데이터와 인덱스가 결합
- 클러스터링 인덱스에서는 데이터 페이지 자체가 인덱스의 일부로 사용됩니다.
- 즉, 기본키 인덱스 노드가 데이터의 실제 레코드를 가리키는 것이 아니라, 데이터가 인덱스에 포함됩니다.
- 보조 인덱스와의 관계
- 보조 인덱스(Secondary Index)는 기본키를 참조합니다.
- 보조 인덱스를 통해 검색하면 기본키를 찾아 다시 클러스터링 인덱스를 탐색하여 데이터를 조회합니다.
다음과 같은 장점이 있습니다.
- 빠른 기본키 검색
- 기본키를 기준으로 데이터를 물리적으로 정렬하므로, 기본키 검색이 매우 빠릅니다.
- 순차적인 데이터 읽기에 유리
- 데이터가 기본키 순서대로 저장되므로, 범위 검색이나 정렬된 결과를 요구하는 작업에서 효율적입니다.
- 디스크 I/O 최적화
- 클러스터링 인덱스를 사용하면 데이터가 물리적으로 정렬되어 있어 한 번의 디스크 탐색으로 여러 데이터 페이지를 읽을 수 있습니다.
다음과 같은 단점이 있습니다.
- 삽입 / 삭제 성능 저하
- 데이터가 물리적으로 정렬되어 저장되므로, 새로운 데이터 삽입 시 기존 데이터를 재배열해야 할 수 있습니다.
- 인덱스 관리 비용 증가
- 클러스터링 인덱스는 데이터와 인덱스가 결합되어 있으므로, 변경 작업(삽입, 삭제, 업데이트) 시 관리 비용이 증가합니다.
- 보조 인덱스의 비효율성
- 보조 인덱스가 기본키를 참조하므로, 보조 인덱스 사용시 추가적인 검색 비용이 발생합니다.
따라서 다음과 같은 경우에 사용하면 좋습니다.
- 범위 검색이 빈번한 경우
- 기본키를 자주 사용하는 경우
- 정렬된 데이터가 필요한 경우
InnoDB의 구조
InnoDB는 In-Memory Structures(메모리 구조) 와 On-Disk Structures(디스크 구조)로 나뉘어 작동합니다.
1. In-Memory Structures ( 메모리 구조 )
1-1) Buffer Pool
Buffer Pool은 다음과 같은 역할을 가지고 있습니다.
- 디스크에서 읽거나 쓸 데이터를 캐싱하는 메모리 공간
- 테이블 데이터와 인덱스를 메모리에 유지하여 디스크 I/O를 줄이고 성능을 향상
1-2) Adaptive Hash Index
Adaptive Hash Index는 다음과 같은 역할을 가지고 있습니다.
- 자주 사용되는 쿼리를 빠르게 처리하기 위해서 해시 기반 인덱스를 동적으로 생성
- 인덱스 탐색 속도를 향상 시킴
1-3) Change Buffer
Change Buffer는 다음과 같은 역할을 가지고 있습니다.
- 디스크 쓰기 작업을 줄이기 위해 INSERT, DELETE와 같은 데이터 변경 작업을 버퍼링
- 나중에 변경 사항이 배치 처리 방식으로 디스크에 반영
따라서, 랜덤 I/O를 줄이고 디스크 성능을 최적화해줍니다.
1-4) Log Buffer
Log Buffer의 역할은 다음과 같습니다.
- 트랜잭션 로그를 메모리에 저장하는 공간
- 데이터 변경 사항이 디스크의 Redo Log로 쓰여지기 전에 임시로 저장
2. On-Disk Structures ( 디스크 구조 )
2-1) System Tablespace
System Tablespace는 다음과 같은 역할을 가지고 있습니다.
- InnoDb의 주요 데이터를 저장하는 기본 테이블스페이스 (ibdata1)
- 시스템 메타데이터, Undo Logs, Change Buffer 등을 포함
2-2) File-Per-Table Tablespaces
File-Per-Table Tablespace는 다음과 같은 역할을 가지고 있습니다.
- 각 테이블 데이터를 독립적인. ibd 파일로 저장
- 테이블 크기 관리와 백업이 용이
2-3) General Tablespaces
General Tablespaces는 다음과 같은 역할을 가지고 있습니다.
- 여러 테이블의 데이터를 공유할 수 있는 사용자 정의 테이블스페이스
- 관리와 성능 최적화를 위한 옵션 제공
2-4) Undo Tablespaces
Undo Tablespaces의 역할은 다음과 같습니다.
- 트랜잭션 중에 데이터 변경 전의 상태(Undo Log)를 저장
- 롤백 작업과 MVCC(Multi-Version Concurrency Control)에 사용
2-5) Redo Log
Redo Log의 역할은 다음과 같습니다.
- 트랜잭션의 변경 내용을 기록하여 데이터 복구에 사용
- Redo Log는 데이터베이스 충돌이나 장애 발생 시 복구 작업에 중요한 역할
2-6) Doublewrite Buffer Files
Doublewirte Buffer Files의 역할은 다음과 같습니다.
- 데이터가 디스크로 쓰이는 동안 손상 방지를 위해 데이터 페이지를 두 번 기록
- 첫 번째는 버퍼 파일에, 두 번째는 최종 위치에 기록
2-7) Temporary Tablespaces
Temporary Tablespaces의 역할은 다음과 같습니다.
- 임시 테이블과 임시 데이터 저장
InnoDB의 작업 흐름
- 읽기 작업
- 디스크의 데이터를 메모리의 Buffer Pool로 로드
- Adaptive Hash Index를 활용해 자주 사용하는 데이터를 빠르게 검색
- 쓰기 작업
- 변경된 데이터는 Log Buffer에 먼저 기로 된 후, Redo Log와 Undo Tablespaces에 저장
- 변경된 데이터는 나중에 Buffer Pool에서 디스크로 반영(배치 쓰기)
- 복구 작업
- Redo Log와 Undo Tablespaces를 활용하여 장애 발생 시 데이터를 복구
각 구조에 대해 한 줄씩 정리해 보면 다음과 같습니다.
In-Memory Structures는 디스크 I/O를 줄이고 성능을 향상시키기 위해 데이터를 캐싱하고, 로그 작업을 처리
On-Dist Structures는 데이터를 영구적으로 저장하고, 데이터 무결성과 복구를 지원
InnoDB는 이러한 메모리와 디스크 구조를 조합하여, 효율적인 데이터 저장, 빠른 검색, 트랜잭션 안전성을 제공합니다.
'CS > 데이터베이스' 카테고리의 다른 글
3D에 대해서 알아보자 (feat. DDL, DCL, DML) (0) | 2025.01.07 |
---|---|
SQL 이란? (0) | 2025.01.07 |
키는 뭘까? (2) | 2025.01.02 |
데이터베이스를 알아보자 (1) | 2025.01.02 |
DBMS 란 무엇일까? (0) | 2025.01.02 |