┌─────────────────────────┐
│ Programming API │
│ (CLI, Web, App Server) │
└───────────┬─────────────┘
│ SQL Query
▼
┌─────────────────────────┐
│ Connection Layer │
│ - Connection Handler │
│ - 인증 (User/Password) │
│ - SSL 처리 │
└───────────┬─────────────┘
▼
┌─────────────────────────┐
│ SQL Layer (Server) │
│ - SQL Parser (구문 분석) │
│ - Optimizer (최적화기) │
│ - Query Cache (캐시) │
│ - Executor (실행기) │
└───────────┬─────────────┘
▼
┌─────────────────────────┐
│ Storage Engine Layer │
│ - InnoDB (기본) │
│ - MyISAM │
│ - Memory, CSV, etc. │
└───────────┬─────────────┘
▼
┌─────────────────────────┐
│ Physical Data Storage │
│ - 데이터 파일(.ibd, .frm) │
│ - 로그 파일 │
│ - 인덱스 파일 │
└─────────────────────────┘
Java, Python 등 다양한 프로그래밍 언어에서 MySQL을 쉽게 사용할 수 있습니다.
MySQL은 각 언어에 맞는 드라이버(Connector)를 제공하여, 개발자가 MySQL 서버에 연결하고 쿼리를 실행할 수 있도록 지원합니다.
MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분하는데, 주로 이 둘을 합쳐서 MySQL 서버라고 합니다.
데이터를 실제로 저장하고 읽는 방법을 결정하는 핵심 모듈입니다.
SQL 문장을 해석하고 실행하는 MySQL 서버의 SQL Layer가 있고, 이 SQL Layer 밑에서 실제 데이터를 다루는 부분이 바로 스토리지 엔진(Storage Engine)입니다.
스토리지 엔진은 실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분을 전담하고 있습니다.
MySQL 엔진은 서버에서 하나만 있지만, 스포리지 엔진은 여러 개를 동시에 사용할 수 있습니다.
-- InnoDB 엔진을 사용하는 테이블
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) ENGINE=InnoDB;
-- MyISAM 엔진을 사용하는 테이블
CREATE TABLE logs (
id INT PRIMARY KEY AUTO_INCREMENT,
log_text TEXT
) ENGINE=MyISAM;
-- MEMORY 엔진을 사용하는 테이블
CREATE TABLE session_cache (
session_id VARCHAR(255) PRIMARY KEY,
data TEXT
) ENGINE=MEMORY;
이처럼 테이블별로 어떤 엔진을 쓸지 골라서 사용가능합니다.
그럼 이렇게 했을 때의 장점은 무엇일까요?
아래는 엔진별로 특징을 구분해봤으며 사용자가 직접 엔진을 추가할 수 있습니다.
| 엔진 | 특징 |
|---|---|
| InnoDB | 트랜잭션 지원, 외래키 지원, 현재 MySQL 기본값 |
| MyISAM | 트랜잭션 미지원, 읽기 속도 빠름 |
| MEMORY | 메모리에 데이터 저장, 재시작 시 데이터 소멸 |
| CSV | CSV 파일로 데이터 저장, 엑셀 호환 용이 |
| ARCHIVE | 압축 저장, 대량의 로그/히스토리 보관 |
| FEDERATED | 원격 MySQL 서버의 테이블에 연결 |
| BLACKHOLE | 데이터를 버리는 엔진(로그만 남김) |