본문 바로가기
ComputerScience/RealMySQL

4.MySQL 아키텍처 - 4.1 MySQL 엔진 아키텍처(2)

by 규난 2022. 11. 28.
728x90

2022.11.22 - [RealMySQL] - 4.MySQL 아키텍처 - 4.1 MySQL 엔진 아키텍처(1)

 

4.MySQL 아키텍처 - 4.1 MySQL 엔진 아키텍처(1)

MySQL 서버는 사람의 머리 역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다. MySQL 엔진 클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL

rbsks.tistory.com

전 포스트에 이어서 MySQL 엔진 아키텍처에 대해서 더 알아보려고 합니다.

 

메모리 할당 및 사용 구조

MySQL의 메모리 사용 및 할당 구조

MySQL에서 사용되는 메모리 공간은 크게 글로벌 메모리 영역로컬(세션) 메모리 영역으로 구분할 수 있습니다.

 

글로벌 메모리 영역

글로벌 메모리 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 운영체제로부터 할당됩니다.

일반적으로 클라이언트 스레드 수와 무관하게 하나의 메모리 공간에만 할당되며, 필요에 따라서 2개 이상의 메모리 공간을 할당받을 수도 있지만 클라이언트의 스레드 수와는 무관합니다. 모든 스레드에 의해 공유되며 대표적인 글로벌 메모리 영역은

테이블 캐시, InnoDB 버퍼 풀, InnoDB 어댑티브 해시 인덱스, InnoDB 리두 로그 버퍼가 있습니다.

 

로컬 메모리 영역

세션 메모리 영역이라고도 표현하며, MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하기 위해 사용되는 메모리 영역입니다.

대표적인 글로벌 메모리 영역은 정렬 버퍼, 조인 버퍼, 바이너리 로그 캐시, 네트워크 버퍼가 있습니다. 클라이언트가 MySQL 서버에 접속하면 클라이언트 커넥션으로부터의 요청을 처리하기 위해 스레드를 하나씩 할당하게 되는데, 클라이언트 스레드가 사용하는 메모리 공간이라고 해서 클라이언트 메모리 영역이라고도 불립니다. 이 메모리 영역은 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되어 사용되지 않는다는 특징이 있습니다. 또한 쿼리의 용도별로 필요할 때만 공간이 할당되거나 필요하지 않은 경우 메모리 공간을 할당조차도 하지 않을 수도 있습니다. 커넷션이 열려 있는 동안 계속 할당된 상태로 남아있는 공간(커넥션 버퍼나 결과 버퍼)도 있고 그렇지 않고 쿼리를 실행하는 순간에만 할당했다가 다시 해제되는 공간(정렬 버퍼나 조인 버퍼)도 있습니다.

 

MySQL 쿼리 실행 과정

MySQL의 쿼리 실행 과정 중 대부분의 작업이 MySQL 엔진에서 처리되고 마지막 데이터 읽기/쓰기 작업만 스토리지 엔진에 의해 처리가 됩니다. MySQL 엔진이 각 스토리지 엔진에게 데이터를 읽어오거나 저장하도록 명령할여면 반드시 핸들러를 통해야 합니다.

 

쿼리 파서 

사용자 요청으로 들어온 쿼리 문장을 토큰(MySQL이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조로 만들어내는 작업 단계입니다. 이 단계에서 쿼리 문장의 기본 문법 오류가 발견되고 사용자에게 오류 메세지를 전달하게 됩니다.

 

전처리기

쿼리 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지를 확인하는 단계입니다. 각 토큰을 테이블 이름, 컬럼 이름, 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한등을 확인합니다. 실제 존재하지 않거나 권한상 사용할 수 없는 토큰이 이 단계에서 걸러지게 됩니다.

 

옵티마이저

쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정하는 단계입니다.

 

실행 엔진(쿼리 실행기)

만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러 요청의 입력으로 연결하는 작업을 합니다.

 

핸들러(스토리지 엔진)

실행 엔진 요청에 의해 데이터를 디스크로 쓰거나 디스크로부터 데이터를 읽어오는 작업을 합니다.

728x90