본문 바로가기

DB

Real My SQL - 아키텍처(1)

My SQL 서버는 크게 MySQL 엔진과 스토리지 엔진(핸들러)로 구분해서 볼 수 있다.

 

MySQL 엔진

- 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 성능향상을 위한 MyISAM 엔진의 키 캐시나 InnoDB의 버퍼 풀과 같은 보조 저장소 기능도 포함되어 있다.

 

스토리지 엔진

 - MySQL엔진은 요청된 SQL 문장을 파서하여 분석하거나 최적화하는 등 DBMS의 두뇌 역할을 하며, 데이터를 디스크에 저장하거나 읽어오는 역할은 스토리지 엔진이 담당한다.

 - 스토리지엔진은 테이블 별로 지정할 수 있다.

 

핸들러 API

 - 실행엔진이 스토리지 엔진(핸들러)에게 데이터를 읽거나 쓰기 요청을 하는데 이러한 요청을 의미한다.

 - InnoDB 스토리지엔진도 핸들러 API를 통해 MySQL 엔진과 데이터를 주고 받는다. 

 

* MySQL은 프로세스 기반이 아닌 스레드 기반으로 동작하며 크게 포그라운드와 백그라운드 스레드로 구분할 수 있다.

 

포그라운드(클라이언트 스레드)

  •  포그라운드 스레드는 SQL 서버에 접속한 클라이언트 수 만큼 존재하며 주로 클라이언트 사용자가 요청한 SQL 문장을 처리하는게 주 임무다. 클라이언트 사용자가 작업을 마치고 커넥션을 종료하면, 해당 커넥션을 담당하던 스레드는 스레드 풀로 되돌아 간다. 이 때 이미 스레드 풀에 일정 개수 이상의 스레드가 존재하면 스레드 풀에 넣지 않고 스레드를 종료시켜 일정 개수의 스레드만이 스레드 풀에 존재하게 한다.
  • 포그라운드 스레드는 MySQL의 데이터 버퍼나 캐시로부터 데이터를 가져오며, 없을경우 디스크로부터 데이터나 인덱스를 읽어와서 작업을 처리한다. 
  • InnoDB 테이블은 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리하며 나머지 버퍼로부터 디스크까지의 write 작업은 백그라운드 스레드가 처리한다.

 

백그라운드 스레드

  • InnoDB는 여러 작업이 백그라운드로 처리된다. 대표적으로 Insert Buffer를 병합하는 스레드, 로그를 디스크로 기록하는 스레드, InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드, 데이터를 버퍼로부터 읽어들이는 스레드, 여러가지 잠금이나 데드락을 모니터링 하는 스레드가 있다. 이들을 총괄하는 메인스레드도 있다.

 

매모리 할당 및 사용구조

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

글로벌 메모리 영역은 MySQL 서버가 시작되면서 운영체제로부터 할당된다. 

글로벌 메모리 영역과 로컬(세션) 메모리 영역은 MySQL 서버 내 존재하는 많은 스레드가 공유해서 사용하는 공간인지 아닌지에 따라 구분된다.

 

글로벌 메모리 영역

 - 모든 스레드가 공유하며 포그라운드 스레드의 수와 무관하다.

 

로컬(세션) 메모리 영역

 - 포그라운드 스레드가 쿼리를 처리하는데 사용되는 메모리 영역이다. 

 - 커넥션 버퍼와 소트버퍼 등이 있다.

 - 각 스레드 별로 독립적으로 할당되며 절대 공유되지 않는다.

 - 로컬(세션) 메모리 영역은 커넥션이 열려있는동안 할당된 상태로 존재하는 공간(커넥션 버퍼, 결과버퍼)도 있고, 쿼리를 실행하는 순간에만 할당되었다가 해제하는 공간(조인버퍼, 소트버퍼)도 있다.

 

 

'DB' 카테고리의 다른 글

Real My SQL - 아키텍처(3)  (0) 2021.06.06
Real My SQL - 아키텍처(2)  (0) 2021.06.06
SQL 문제풀이 6)  (0) 2020.12.20
SQL 문제풀이 5)  (0) 2020.12.19
SQL 문제풀이 4)  (0) 2020.12.18