MySQL의 전체 구조
MySQL 엔진
클라이언트 접속과 SQL 요청을 처리하는 커넥션 핸들러, 쿼리 파서, 전처리기, 옵티마이저, 실행 엔진 등으로 구성되어 있다. MySQL은 표준 SQL 문법을 지원하기 때문에 표준 문법에 따라 작성된 쿼리는 타 DBMS에서 실행이 가능하다.
스토리지 엔진
데이터를 실제로 디스크에 저장하거나, 디스크에 저장된 데이터를 읽어오는 역할을 담당한다. MySQL에서는 여러 가지 스토리지 엔진을 사용하는 게 가능하다. InnoDB, MyISAM, NDB Cluster, Memory 등 여러 가지 스토리지 엔진을 가지고 있다.
운영체제 & 하드웨어
실제 테이블 데이터와 로그 데이터를 파일로 저장한다.
위에서 MySQL 엔진과 스토리지 엔진은 서로 핸들러 API를 사용하여 데이터를 주고 받는다.
쿼리 실행 구조
쿼리 파서
사용자 요청으로 들어온 쿼리 문장을 토큰으로 분리해 트리 형태의 구조로 만들어 내는 작업을 한다. 이 과정에서 쿼리 문장의 기본 문법 오류를 발견 및 사용자에게 오류 메시지를 전달한다.
전처리기
파서 과정에서 만들어진 파서 트리를 기반으로 SQL 쿼리 문장에 구조적인 문제점을 확인한다. 파서 트리의 각 토큰이 유효한지 확인하는 과정을 수행한다. 실제로 존재하지 않거나 권한상 사용할 수 없는 개체의 토큰은 여기서 걸러진다.
옵티마이저
SQL 쿼리 문장의 실행을 최적화해서 실행 계획을 수립하는 역할을 담당한다.
- 규칙 기반 최적화 - 옵티마이저에 내장된 우선순위에 따라 실행 계획 수립
- 비용 기반 최적화 - 작업이 비용과 대상 테이블의 통계 정보를 활용해서 실행 계획 수립
퀴리 실행 엔진
옵티마이저에서 받은 실행 계획대로 스토리지 엔진을 호출해서 받은 결과인 레코드를 읽고 쓰는 역할을 한다.
쿼리 캐시
MySQL 서버에서 빠른 응답을 하는 역할을 한다. SQL의 실행 결과를 메모리에 캐시 하고, 동일 SQL 쿼리가 실행되면 테이블을 읽지 않고 결과를 반환해서 매우 빠른 성능을 보여준다. 테이블의 데이터가 변경되면 캐싱된 데이터를 삭제해야 하는데 이는 동시 처리 성능을 저하했다. MySQL 8.0부터 완전히 제거되었다.
MySQL 스레딩 구조
포그라운드 스레드
최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재하며, 주로 각 클라이언트 사용자가 요청하는 쿼리 무장을 처리한다.
클라이언트 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 다시 스레드 캐시로 돌아간다. 이때 이미 스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드 캐시에 넣지 않고 종료시켜 일정 개수의 스레드만 스레드 캐시에 존재하게 한다.
데이터를 MySQL의 데이터 버퍼나 캐시로부터 가져오며, 버퍼나 캐시에 없는 경우에는 직접 디스크의 데이터나 인덱스 파일로부터 데이터를 읽어와서 작업을 처리한다.
MyISAM 테이블은 디스크 쓰기 작업까지 포그라운드 스레드가 처리한다. InnoDB 테이블은 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리하고, 나머지 버퍼로부터 디스크까지 기록하는 작업은 백그라운드 스레드에서 처리한다.
백그라운드 스레드
InnoDB는 다음과 같은 작업을 백그라운드로 처리된다.
- 인서트 버퍼를 병합하는 스레드
- 로그를 디스크로 기록하는 스레드
- InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
- 데이터를 버퍼로 읽어 오는 스레드
- 잠금이나 데드락을 모니터링하는 스레드
이 중에서도 가장 중요한 것은 로그 스레드(Log Thread)와 버퍼의 데이터를 디스크로 내려쓰는 작업을 처리하는 쓰기 스레드(Write Thread)이다.
읽기 작업은 클라이언트 스레드에서 처리되기 때문에 읽기 스레드는 많이 설정할 필요가 없다. 하지만 쓰기 스레드는 아주 많은 작업을 백그라운드로 처리하기 때문에 일반적인 내장 디스크를 사용할 때는 2~4 정도, DAS나 SAN과 같은 스토리지를 사용할 때는 디스크를 최적으로 사용할 수 있을 만큼 충분히 설정해야 한다.
참조
Real MySQL
https://www.youtube.com/watch?v=vQFGBZemJLQ
https://mysterious-dev.tistory.com/1
'DB' 카테고리의 다른 글
[MySQL] MySQL 최적화에 대한 공부(2/2) (1) | 2025.05.19 |
---|---|
[MySQL] MySQL 최적화에 대한 공부(1/2) (2) | 2025.05.02 |