MySQL 엔진 아키텍처
- MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있음
- MySQL엔진은 클라이언트로부터 접속 및 쿼리요청을 처리하는 커넥션 핸들러 부분과 SQL 파서 & 옵티마이저 등으로 구성
- 스토리지 엔진은 데이터를 디스크 스토리지에 저장하거나 읽는 등의 작업을 처리
- 스토리지 엔진은 여러 개를 동시에 사용할 수 있음
- 핸들러 API는 스토리지 엔진과 MySQL 엔진의 사이에 존재하며, 각 요청을 주고받을 때 사용됨
MySQL 스레딩 구조
- MySQL 서버는 프로세스 기반이 아닌 스레드 기반
- 포그라운드 스레드와 백그라운드 스레드로 구분할 수 있음.
- 동일한 기능을 수행하는 스레드를 여러 개 포크해서 병렬처리도 가능
포그라운드 프로세스
- 최소 MySQL 서버에 접속된 클라이언트 수만큼 존재
- 클라이언트 사용자가 요청하는 쿼리 문장을 처리
- 스레드는 작업을 마치고 커넥션을 종료하면 스레드 캐시로 돌아감.
- 스레드 캐시에 일정 수의 스레드가 존재할 경우(thread_cache_size 만큼) 스레드를 종료 시킴
- 데이터를 데이터버퍼나 캐시로부터 가져오고, 버퍼나 캐시에 없는 경웅에는 직접 디스크나 인덱스 파일로부터 데이터를 읽어와서 작업을 처리함
- 이때 MyISAM은 디스크 접근까지, InnoDB는 데이터버퍼나 캐시 접근까지만 수행
백그라운드 프로세스
- InnoDB를 사용하면 여러 작업이 백그라운드로 처리됨
- 인서트 버퍼를 병합하는 스레드
- 로그를 디스크로 기록하는 스레드
- InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
- 데이터를 버퍼로 읽어 오는 스레드
- 잠금이나 데드락을 모니터링하는 스레드
메모리 할당 및 구조
글로벌 메모리
- 모든 스레드에 의해 공유
- 아래와 같은 용도로 사용
- 테이블 캐시
- InnoDB 버퍼 풀
- InnoDB 어댑티브 해시 인덱스
- InnoDB 리두 로그 버퍼
로컬 메모리
- 클라이언트 스레드별로 독립적으로 할당
- 아래와 같은 용도로 사용
- 정렬 버퍼
- 조인 버퍼
- 바이너리 로그 캐시
- 네트워크 버퍼
쿼리 실행 구조
쿼리를 실행하는 구조는 아래와 같은 프로세스로 진행이 됨
1. 쿼리 파서: 요청된 쿼리 문장을 토큰 단위로 분해
2. 전처리기 실행: 쿼리에 오류가 있는 지 확인
3. 옵티마이저 실행: 요청된 쿼리를 최적화, 쿼리를 빠르게 만든다는 것은 다시말하면 옵티마이저를 잘 활용한다고 말할 수 있음.
4. 쿼리 실행: 스토리지 엔진 등을 실행하여 데이터 조작
쿼리 캐시
- 기존에는 빠른 쿼리 처리를 위하여 쿼리 캐시가 도입되었지만, MySQL 8.0부터는 지원하지 않음
스레드 풀
- MySQL 커뮤니티 에디션은 스레드 풀 기능을 제공하지 않음. 엔터프라이즈 급에서 사용이 가능
- 스레드 풀은 스레드 개수를 조절함. 따라서 요청이 많아지더라도 스레드 개수를 조절하여 잦은 context switch가 발생하지 않도록 함
- 다만 스레드 풀에 의해 스레드가 생성되지 않으면 connection에서 지연이 발생하므로, 서비스의 특성에 맞게 조절해야 함
'데이터베이스' 카테고리의 다른 글
InnoDB 스토리지 엔진 아키텍처 (0) | 2023.02.21 |
---|