Chap04. 아키텍처

ddsad

Mysql 서버는 크게 Mysql 엔진과 스토리지 엔진으로 구분할 수 있다.

전체 구조

Mysql 엔진

클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 또한 MySQL은 표준 Sql 문법을 지원하기 때문에 표준 문법에 따라 작성된 쿼리는 타 DBMS와 호환되어 실행될 수 있다.

스토리지 엔진

실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분을 담당한다. MySQL서버에서 MySQL엔진은 하나지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다.

다음 예제와 같이 테이블이 사용할 스토리지 엔진을 지정하면 이후 해당 테이블의 모든 읽기 작업이나 변경 작업은 정의된 스토리지 엔진이 처리한다.

CREATE TABLE test_table(fd1 INT, fd2 INT) ENGINE=INNODB;

위 예제에서 test_table은 InnoDB 스토리지 엔진을 사용하도록 정의했다. 이제 test_table에 대해 INSERT, UPDATE, DELETE, SELECT... 작업이 발생하면 InnoDB 스토리지 엔진이 처리를 담당한다. 그리고 각 스토리지 엔진은 성능 향상을 위해 키 캐시(MyISAM 스토리지 엔진)나 InnoDB 버퍼 풀(InnoDB 스토리지 엔진)과 같은 기능을 내장하고 있다.

핸들러 API

Mysql 엔진의 쿼리 실행기에서 데이털르 쓰거나 읽어야 할 때는 각 스토리지 엔진에 쓰기/읽기를 요청하는데 이러한 요청을 핸들러 요청이라 하고, 여기서 사용되는 API를 핸들러 API라고 한다. InnoDB 스토리지 엔진 또한 이 핸들러 API를 이용해 MySQL엔진과 데이터를 주고 받는다.

핸들러 API를 통해 얼마나 많은 데이터(레코드) 작업이 있었는 지는 아래 명령으로 확인할 수 있다.

SHOW GLOBAL STATUS LIKE 'Handler%';

MySQL 스레딩 구조

MySQL 서버는 프로세스 기반이 아닌 스레드 기반으로 작동하며 크게 포그라운드 스레드와 백그라운드 스레드로 구분할 수 있다. MySQL 서버에서 실행 중인 스레드의 목록은 다음과 같이 확인할 수 있다.

SELECT thread_id, name, type, processlist_user, processlist_host FROM performance_schema.threads ORDER BY type, thread_id;

포그라운드 스레드

포그라운드 스레드는 최소한 MySQL 서버에 접속된 클라이언트 수만큼 존재하며, 주로 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리한다. 클라이언트 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 다시 스레드 캐시로 되돌아간다.