1. 개요
1) MySQL 엔진: 사람으로 치면 두뇌역할
2) MySQL 스토리지 엔진: 사람으로 치면 손, 발 역할 (InnoDB, MyISAM)
2. MySQL 엔진 구조
MySQL은 다른 RDBMS와 마찬가지로 대부분 프로그래밍 언어로부터 접근을 지원한다.
JDBC, ODBC 등 의 표준 드라이버를 이용해 자바나 파이썬 등 MySQL 서버에서 쿼리를 사용할 수 있도록 지원한다.
1) MySQL 엔진
요청된 SQL 문장을 분석하거나 최적화 등 두뇌에 해당하는 처리를 수행한다. 클라이언트로부터 접속이나 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리 최적화된 실행을 위해 옵티마이저가 중심을 이룬다. 또한 MySQL은 표준 SQL 문법을 지원하기 때문에 다른 RDBMS에 호환될 수 있다.
2) 스토리지 엔진
스토리지 엔진은 데이터를 저장소에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 전담한다. MySQL 서버에서 MySQL 스토리지 엔진은 여러 개를 동시에 사용할 수 있다. 아래와 같이 테이블이 사용할 스토리지 엔진을 지정하면 이후 해당 테이블의 모든 읽기 작업이나 변경 작업은 명시한 스토리지 엔진이 처리한다.
CREATE TABLE test_1 (t1 INT, t2 INT) ENGINE=INNODB;
test_1에 데이터 추가, 변경, 삭제 작업이 생기면 InnoDB 스토리지 엔진이 처리를 담당한다. 스토리지 엔진은 성능 향상을 위해 키 캐시나 InnoDB 버퍼 풀과 같은 기능을 가지고 있다.
3) 핸들러 API
MySQL 엔진의 쿼리 실행기에서 데이터 변경이 생기면 각 스토리지 엔진에 데이터 쓰기 또는 읽기를 요청하는데, 이러한 요청을 핸들러 요청이라 하고, 이때 사용하는 API를 핸들러 API라고 한다. InnoDB 스토리지 엔진 또한 이 핸들러 API를 이용해 MySQL 엔진과 데이터를 주고받는다. 핸들러 API를 통한 데이터 작업량은 SHOW GLOBAL STATUS LIKE 'HANDLER%'; 로 확인할 수 있다.
3. MySQL 스레드 구조
MySQL 서버는 스레드 기반으로 작동되고 포그라운드 스레드, 백그라운드 스레드를 구분할 수 있다. 실행 중인 스레드의 목록은 아래와 같이 performance_schema 데이터베이스의 threads 테이블을 통해 확인이 가능하다.
SELECT thread_id, name, type, processlist_user, processlist_host
FROM performance_schema.threads;
1) 포그라운드 스레드
클라이언트 스레드인 포그라운드 스레드는 최소한 MySQL 서버에 접속된 클라이언트 수만큼 존재하고, 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리를 수행한다. 클라이언트 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하는 스레드는 다시 스레드 캐시로 되돌아간다. 이때 기존 스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드 캐시에 넣지 않고 스레드를 종료시켜 일정 개수의 스레드만 스레드 캐시에 존재하게 한다. 스레드 캐시에 유지할 수 있는 최대 스레드 개수는 thread_cache_size 시스템 변수로 설정한다.
* 참고: MySQL에서는 클라이언트 스레드와 포그라운드 스레드를 똑같은 의미로 사용한다. 클라이언트 MySQL 서버에 접속하게 되면 MySQL 서버는 클라이언트의 요청을 처리해 줄 스레드를 생성해 그 클라이언트에 할당하게 된다. 이 스레드는 DBMS의 앞단에서 클라이언트와 통신하기 때문에 포그라운드 스레드라고 하며, 사용자가 요청한 작업을 처리하기 때문에 사용자 스레드라고도 한다.
2) 백그라운드 스레드
InnoDB 같은 경우 아래와 같이 여러 작업이 백그라운드로 실행된다.
- Insert 버퍼를 병합하는 스레드
- Lock이나 데드락을 모니터링하는 스레드
- 데이터를 버퍼로 읽어 오는 스레드
- InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
- 로그를 저장소로 기록하는 스레드
사용자의 요청을 처리하는 데 있어서 쓰기 작업은 지연될 수 있지만, 데이터의 읽기 작업은 지연될 수 없다. 그래서 일반적인 상용 DBMS에는 대부분 쓰기 작업을 버퍼링 해서 일괄 처리하는 기능이 있으며, InnoDB 또한 이러한 방식으로 처리한다.
반면에 MyISMA은 데이터 변경 쿼리가 요청될 경우 데이터가 디스크의 데이터 파일로 완전히 저장될 때까지 기다리지 않아도 된다. 그리고 일반적인 쿼리는 쓰기 버퍼링 기능을 사용할 수 없다.
4. MySQL 메모리 할당 및 사용 구조
1) 글로벌 메모리 영역: InnoDB 버퍼 풀, MyISAM 키 캐시, 바이너리 로그 버퍼, 리두 로그 버퍼, 테이블 캐시
2) 세션(커넥션) 메모리 영역: 조인 버퍼, 정렬 버퍼, 네트워크 버퍼, 리드 버퍼
글로벌 메모리 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 운영체제로부터 할당된다. 운영체제의 종류마다 다르겠지만 요청된 메모리 공간을 100% 할당해줄 수 있고, 할당된 공간만큼 예약해두고 필요할 때 조금씩 할당해주는 케이스도 있다. 글로벌 메모리 영역과 로컬 메모리 영역은 MySQL 서버 내에 존재하는 많은 스레드가 공유해서 사용하는 공간인지 여부에 따라 구분되며, 각각 다음과 같은 특성이 있다.
- 2편에서 계속 -
'IT' 카테고리의 다른 글
리눅스 디렉터리 구조 (0) | 2022.10.05 |
---|---|
MySQL 아키텍처 - 2 (0) | 2022.09.27 |
MySQL 사용자 계정 관리 - 1 (0) | 2022.09.21 |
MySQL 정적 변수와 동적 변수 (0) | 2022.09.19 |
CITUS DB - 기본 개념 (0) | 2022.09.19 |
댓글