mysql 이 어떻게 돌아가고 어떤 구조로 돼 있는지 공부해야지 해야지 하다가 이제서야 공부하고 글을 작성해 보려고 한다.
다른 블로그에도 지금 작성하는 내용과 같거나, 비슷한 내용이 작성 돼 있는 곳이 많기 때문에 살짝 의식의 흐름대로 작성한다.
이 글은 [REAL MySQL] 이라는 책을 기반으로 작성한다.
MySQL 의 전체 구조
우선 책에도 나와있지만, 간단히 MySQL 전체적인 구조를 한 번 보는게 좋을 것 같다.
우선 앞으로 설명할 것들은 MySQL 을 크게 구분할 수 있는 [MySQL 엔진], [스토리지 엔진] 부분이다.
### MySQL 엔진
접속 및 쿼리 요청 처리하는 커넥션 핸들러, SQL 파서, 전처러리기, 쿼리 최적화를 위한 옵티마이저로 이루어져 있다.
또, InnoDB 의 버퍼 풀, MyISAM 의 키 캐시 저장소 같은 보조 저장소 기능이 포함 돼 있다.
> MyISAM 을 뭐라 읽는지 검색 해 보았는데 마이아이삼 이렇게 읽는 듯하다. 외국인 유투버도 저렇게 발음했음
### 스토리지 엔진
데이터를 디스크 스토리지에 저장, 읽어오는 부분은 스토리지 엔진이 담당한다.
여기서 한 가지 알아야 하는 부분은 MySQL 엔진은 하나이지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다.
### 핸들러 API
MySQL 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽어야 할 때는 각 스토리지 엔진에게 쓰기 또는 읽기를 요청하는데 이러한 요청을 핸들러 요청이라고 한다. 이 때 사용되는 API 들이 핸들러 API 라고 한다.
아래 사진처럼 핸들러 API 가 지금까지 몇 번 수행 되었는지 알 수 있다.
write 가 굉장히 많군
Mysql 스레딩 구조
우선 알아야 할 점은 MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동한다는 것이다.
그렇기 때문에 크게 포그라운드, 백그라운드 스레드를 사용하며 구분할 수 있다.
### 포그라운드 스레드
최소한 접속된 클라이언트의 수만큼 존재하며, 사용자가 요청하는 쿼리 문장을 처리한다. 커넥션 종료 시 다시 스레드 풀로 들어가는 듯하다.
또, 포그라운드 스레드는 데이터를 데이터 버퍼나 캐시로부터 갖고오고 버퍼나 캐시에 데이터가 없으면 직접 디스크의 데이터, 인덱스 파일로부터 데이터를 읽어와 처리한다.
### 백그라운드 스레드
InnoDB 에서는 다음과 같은 스레드가 존재한다.
- 인서트 버퍼를 병합하는 스레드
- 로그를 디스크로 기록하는 스레드
- InnoDB 버퍼 풀의 데이터를 디스크록 기록하는 스레드
- 데이터를 버퍼로 읽어들이는 스레드
- 잠금이나 데드락을 모니터링하는 스레드
- 모든 스레드를 총괄하는 메인 스레드
나머지 내용은 2에서 작성하도록 함.