[SQL] MySQL 아키텍처 정리(1)

DeMar_Beom·2024년 3월 23일
0

SQL

목록 보기
17/17

MySQL 구조

앞선 블로그 글에서 조금씩 작성하긴 했었지만 전체적으로 정리가 필요할 거 같아 MySQL의 전체적인 아키텍처를 정리하려고 합니다.
해당 글은 Real MySQL8.0을 중점으로 정리하고 다른 책, 블로그 내용을 참고하여 정리한 내용입니다.

MySQL 구성

  • MySQL은 기본적으로 MySQL서버-MySQL클라이언트구조로 구성되어 MySQL서버가 Database이며 각 클라이언트들은 JDBC, ODBC 등 다양한 클라이언트 컴포넌트로 서버와 연결하여 데이터베이스를 이용합니다.
  • MySQL서버는 크게 스토리지 엔진과 MySQL엔진으로 구분됩니다.

MySQL 엔진

  • 요청된 SQL구문을 분석 및 최적화하는 두뇌 역할

스토리지 엔진

  • 실제 Data를 디스크에 저장 및 읽어오는 역할
  • MySQL은 사용자의 요청(Handler API)을 통해 MySQL엔진과 스토리지 엔진간 데이터를 주고 받습니다.

MySQL 엔진 구성요소

✅ 커넥션 핸들러
✅ SQL파서
✅ 전처리기
✅ 옵티마이저

MySQL 쿼리실행 구조

  • 쿼리파서는 사용자의 요청 쿼리문을 MySQL이 인식할 수 있는 최소단위의 토큰으로 분리하여 트리 형태로 구조를 구성 (문법 오류 확인)
  • 전처리기에서 나누어진 트리를 기반으로 쿼리문장에 구조적 문제ㄴ점을 확인(접근 권한, TABLE/COLUMN객체 존재 여부 등)
  • 옵티마이저에서 쿼리를 실행하기 전에 어떻게 효율적으로 실행시킬지를 결정하는 역할로 사용
  • 이렇게 최적화된 내용을 바탕으로 쿼리 실행기에서 데이터를 쓰거나 읽을 때 스토리지 엔진의 요청을 하는 데 이 때 하는 것이 Handler API요청

MySQL Hanlder

  • Handler API요청은 MySQL엔진에서 스토리지 엔진에 요청할 때 하는단순히 읽고 쓰는 요청입니다. 이러한 API요청의 종류는 다양하며 아래와 같이 입력 시 다양한 API요청의 종류를 확인할 수 있습니다.
show global status like '%Handler%';

  • 중요한 것은 해당 Handler 를 확인할 때에는 주로 sql 쿼리문을 튜닝할 때 필요합니다.
  • 예를 들어 Handler_read_rnd의 경우 테이블 스캔 시 데이터 파일의 고정된 행을 읽은 횟수로, 대상 테이블에 적절한 인덱스가 없을 시 발생합니다. 또한 랜덤버퍼의 사이즈를 초과하는 정렬 연산 시에도 발생하므로, 쿼리문에서 해당 수치가 증가하는 원인을 파악하고 적절한 인덱스를 설계해야 합니다.

MySQL 스레드 구조

  • MySQL서버는 멀티 스레드 기반으로 동작하는데 크게 포그라운드 스레드, 백그라운드 스레드로 구분됩니다.

포그라운드 스레드

  • User session마다 생기는 포그라운드 스레드가 담당하여 유저의 쿼리 요청을 처리합니다.

백그라운드 스레드

  • MySQL의 내부적인 처리를 진행하는 백그라운드 스레드

포그라운드 스레드

  • 포그라운드 스레드는 최소한의 MySQL서버에 접속된 클라이언트 수만큼 존재하여, 작업 종료 후 커넥션 종료 시 해당 스레드는 Thread cache로 돌아감
  • 이 때 사용하는 변수가 thread_cache_size 해당 변수 수만큼 caching되며, 그 이상의 thread는 종료됨
  • 추가적으로 이전 블로그 내용에서 정리한 내용이 있으니 봐주시면 감사하겠습니다.

백그라운드 스레드

  • MySQL의 InnoDB엔진의 경우 대다수의 작업을 백그라운드 스레드에서 수행
  • data읽기 등의 작업 포그라운드 스레드에서 처리하지만 data쓰기 작업의 경우 대부분의 작업을 백그라운드 스레드에서 담당
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에 필요하지 않은 데이터 제거

0개의 댓글