앞선 블로그 글에서 조금씩 작성하긴 했었지만 전체적으로 정리가 필요할 거 같아 MySQL의 전체적인 아키텍처를 정리하려고 합니다.
해당 글은 Real MySQL8.0을 중점으로 정리하고 다른 책, 블로그 내용을 참고하여 정리한 내용입니다.
MySQL서버-MySQL클라이언트
구조로 구성되어 MySQL서버가 Database이며 각 클라이언트들은 JDBC, ODBC 등 다양한 클라이언트 컴포넌트로 서버와 연결하여 데이터베이스를 이용합니다. MySQL 엔진
- 요청된 SQL구문을 분석 및 최적화하는 두뇌 역할
스토리지 엔진
- 실제 Data를 디스크에 저장 및 읽어오는 역할
✅ 커넥션 핸들러
✅ SQL파서
✅ 전처리기
✅ 옵티마이저
MySQL 쿼리실행 구조
- 쿼리파서는 사용자의 요청 쿼리문을 MySQL이 인식할 수 있는 최소단위의 토큰으로 분리하여 트리 형태로 구조를 구성 (문법 오류 확인)
- 전처리기에서 나누어진 트리를 기반으로 쿼리문장에 구조적 문제ㄴ점을 확인(접근 권한, TABLE/COLUMN객체 존재 여부 등)
- 옵티마이저에서 쿼리를 실행하기 전에 어떻게 효율적으로 실행시킬지를 결정하는 역할로 사용
- 이렇게 최적화된 내용을 바탕으로 쿼리 실행기에서 데이터를 쓰거나 읽을 때 스토리지 엔진의 요청을 하는 데 이 때 하는 것이 Handler API요청
show global status like '%Handler%';
Handler_read_rnd
의 경우 테이블 스캔 시 데이터 파일의 고정된 행을 읽은 횟수로, 대상 테이블에 적절한 인덱스가 없을 시 발생합니다. 또한 랜덤버퍼의 사이즈를 초과하는 정렬 연산 시에도 발생하므로, 쿼리문에서 해당 수치가 증가하는 원인을 파악하고 적절한 인덱스를 설계해야 합니다.포그라운드 스레드
- User session마다 생기는 포그라운드 스레드가 담당하여 유저의 쿼리 요청을 처리합니다.
백그라운드 스레드
- MySQL의 내부적인 처리를 진행하는 백그라운드 스레드
thread_cache_size
해당 변수 수만큼 caching되며, 그 이상의 thread는 종료됨SHOW ENGINE INNODB STATUS;
1. Master thread : 백그라운드의 스레드의 관리 및 스케줄링을 담당
2. Insert Buffer Thread : Insert buffer merge스레드 (change buffer)
3. Log Thread : redo log 작성
4. Read Thread : read요청 처리
5. Write Thread : write요청 처리
6. Page cleaner Thread : buffer pool의 dirty page를 disk로 flush
7. Purge Thread : Rollback에 필요하지 않은 데이터 제거