MySQL 서버 구성
- 전체 구조
1. MySQL 엔진
- 커넥션 핸들러
- 스토리지 엔진에 쓰기 또는 읽기를 요청할 때 사용하는 API 를 핸들러 API 라 한다.
- SQL 인터페이스
- SQL 파서
- SQL 옵티마이저
- 캐시 & 버퍼
2. 스토리지 엔진
- InnoDB 엔진
- 성능 향상 위해 InnoDB 버퍼 풀 내장
- MyISAM 스토리지 엔진
- 성능 향상 위해 키 캐시 내장
- 역할
- SQL 문장 분석과 최적화
- DBMS 두뇌에 해당하는 처리를 수행
- 실제 데이터를 디스크 스토리지에 저장하거나 읽기 전담
- 스토리지 엔진 여러개 사용 가능 ( 테이블별로 다른 스토리지 엔진 적용이 가능하다)
MySQL 스레딩 구조
- 프로세스 기반이 아닌 스레드 기반으로 작동한다.
- 스레드
포그라운드 스레드(클라이언트 스레드)
- 최소한 MySQL 서버에 접속된 클라이언트 수만큼 존재
- 엔터프라이즈 에디션에서는 스레드 풀을 사용하며 하나의 스레드가 여러 개의 커넥션 요청을 담당한다.
- 주로 클라이언트가 요청하는 쿼리 문장 처리
- thread cache
- 데이터를 데이터 버퍼나 캐시로부터 가져온다. 두 곳에 모두 없을 경우엔 직접 디스크나 인덱스 파일로부터 읽어온다.
백그라운드 스레드
- 처리하는 작업
- insert buffer 병합
- 로그를 디스크로 기록
- innoDB 버퍼 풀의 데이터를 디스크에 기록
- 데이터를 버퍼로 읽어오기
- 잠금이나 데드락 모니터링
- 쓰기 작업은 지연(버퍼링)되어 처리된다.
MySQL 메모리
- 글로벌 영역은 MySQL 서버가 시작될 때 OS로부터 할당 받는다.
글로벌 메모리 영역
- InnoDB 버퍼 풀
- MyISAM 키 캐시
- 바이너리 로그 버퍼
- 리두 로그 버퍼
- 테이블 캐시
세션(커넥션) 메모리 영역
- 세션 메모리 영역은 스레드별로 독립적으로 사용하는 영역
- 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않은 경우 할당되지 않을 수 있다.
- 조인 버퍼
- 정렬 버퍼
- 네트워크 버퍼
- 리드 버퍼
- 바이너리 로그 캐시
MySQL 엔진 아키텍처
핸들러
쿼리 실행 구조
쿼리 파서
사용자 요청으로 들어온 쿼리 문장을 토큰(MySQL 이 인식할 수 있는 최소 단위의 어휘나 기호)로 분리해 트리 형태 구조로 만들어낸다.
여기서 기본 문법 오류를 발견한다.
전처리기
파서 트리를 기반으로 쿼리 문장의 구조적 문제를 확인한다.
토큰을 테이블 이름이나 칼럼 이름 등에 매핑해 해당 객체의 존재 여부와 접근 권한을 확인한다.
권한이 없으면 개체의 토큰을 거른다.
옵티마이저
사용자의 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정하는 역할을 담당한다.
DBMS 의 두뇌에 해당한다.
실행 엔진
실행 엔진은 만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러의 요청으로 연결하는 역할을 수행한다.
쿼리 캐시
- 빠른 응답을 필요로 하는 웹 기반의 응용 프로그램에서 매우 중요한 역할을 담당했음
- SQL 실행 결과를 메모리에 캐싱
- 동시 처리 성능 저하와 많은 버그로 인해 8.0 버전에서 삭제됨
스레드 풀
- 목적 사용자의 요청을 처리하는 스레드 개수를 줄여서 동시 처리되는 요청이 많다 하더라도
MySQL 서버의 CPU가 제한된 개수의 스레드 처리에만 집중할 수 있게 해서 서버의 자원 소모를 줄이는 것이 목적
- 스케줄링 과정에서 CPU 시간을 제대로 확보하지 못하면 쿼리 처리가 더 느려지는 사례도 발생한다.
- 잘 사용하면 프로세스 친화도 높이고 불필요한 컨텍스트 스위치 줄여 오버헤드 낮춤
- 94 페이지 복습
트랜잭션 메타데이터