MySQL(1)
오늘 배운 것
MySQL 아키텍처와 스레딩 구조 정리
MySQL 전체 구조
MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 나뉜다.
- MySQL 엔진
- MySQL의 두뇌 역할을 하는 계층
- SQL 인터페이스, SQL 파서, SQL 옵티마이저, 캐시, 버퍼 등을 포함한다
- 자바, C, .NET과 같은 프로그래밍 언어는 커넥션 핸들러(Connection Handler)를 통해 MySQL 엔진에 접속한다
- 스토리지 엔진(Storage Engine)
- MySQL의 손과 발 역할을 한다
- 실제 데이터를 디스크 스토리지에 저장하거나 읽어온다
- 대표적인 스토리지 엔진: InnoDB, MyISAM, MEMORY
- 하나의 MySQL 서버에서 여러 스토리지 엔진을 동시에 사용할 수 있다
CREATE TABLE test_table (
fd1 INT,
fd2 INT
) ENGINE=INNODB;
위 쿼리로 생성한 test_table
은 InnoDB 스토리지 엔진이 INSERT, UPDATE, SELECT 등을 처리한다.
각 스토리지 엔진은 고유의 기능을 내장한다. 예를 들어, MyISAM은 키 캐시(Key Cache) 기능을 지원한다.
핸들러 API (Handler API)
-
커넥션 핸들러(Connection Handler):
JDBC, CLI 등 클라이언트가 MySQL 서버에 접속할 때 연결을 생성·관리한다. -
핸들러 API:
MySQL 엔진의 쿼리 실행기가 스토리지 엔진에 읽기·쓰기 요청을 보낼 때 사용하는 내부 인터페이스다.
스토리지 엔진(InnoDB, MyISAM 등)은 이 API를 구현하여 MySQL 엔진과 데이터를 주고받는다.
MySQL 스레딩 구조
MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 동작한다.
Enterprise Edition이나 Percona MySQL 서버에서는 스레드 풀(Thread Pool) 모델을 사용하기도 한다.
- 전통적인 스레드 모델
- 커넥션마다 포그라운드 스레드가 1:1로 생성·할당된다
- 스레드 풀 모델
- 하나의 포그라운드 스레드가 여러 커넥션 요청을 순차적으로 처리한다
포그라운드 스레드 (Foreground Thread, 클라이언트 스레드)
- MySQL에서 포그라운드 스레드 = 사용자 스레드(User Thread) 의미다
- 클라이언트가 MySQL 서버에 접속하면 요청을 처리할 스레드를 할당한다
- DBMS의 앞단에서 사용자와 직접 통신하므로 foreground thread라고 부른다
- 사용자가 작업을 마치고 커넥션 종료 시 해당 스레드는 스레드 캐시(Thread Cache)로 반환한다
- 캐시 대기 스레드가
thread_cache_size
이상이면 종료한다
- 캐시 대기 스레드가
포그라운드 스레드의 작업 범위
- 공통: 데이터 버퍼나 캐시에서 데이터 읽기, 없으면 디스크/인덱스 파일에서 직접 읽는다
- MyISAM: 디스크 쓰기 작업까지 포그라운드 스레드가 담당한다
- InnoDB: 버퍼/캐시까지만 처리하고, 디스크 쓰기는 백그라운드 스레드가 담당한다
백그라운드 스레드 (Background Thread)
- MyISAM: 대부분 작업이 포그라운드 스레드에서 처리되므로 백그라운드 스레드 역할이 제한적이다
- InnoDB: 다음과 같은 작업들이 백그라운드 스레드에서 처리된다
- Insert Buffer 병합
- 로그를 디스크에 기록(Log Thread)
- InnoDB 버퍼 풀의 데이터를 디스크에 기록(Write Thread)
- 데이터를 버퍼로 읽어오기
- 잠금/데드락 모니터링
특히 Log Thread와 Write Thread가 매우 중요한 역할을 한다.
읽기 vs 쓰기 처리 방식
- 읽기(SELECT): 지연 처리 없이 즉시 결과 반환 (버퍼링 없음)
- 쓰기(INSERT/UPDATE/DELETE): InnoDB는 버퍼링 가능, MyISAM은 대부분 포그라운드에서 처리 → 버퍼링 효과 적다
내일 할 일
- 알고리즘, Real MySQL 다음부분 공부