엔진 아키텍처

MySQL 엔진

MySQL 엔진은 클라이언트로부터의 요청을 처리하는 커넥션 핸들러, SQL 파서, 전처리기, 쿼리 최적화를 위한 옵티마이저로 구성되어있다.
MySQL 엔진은 SQL 문장을 분석 및 최적화와 같은 처리를 수행한다.

스토리지 엔진

스토리지 엔진은 실제 데이터를 디스크에 저장하거나 읽어오는 부분은 전담한다.
MySQL 엔진은 1개이지만 스토리지 엔진은 n개를 동시에 사용할 수 있다.

create table test_table (fd1 INT, fd2 INT) ENGINE=INNODB;

위의 경우 InnoDB 스토리지엔진이 test_table에 대한 작업을 담당한다.

스토리지 엔진은 성능 향상을 위해 키 캐시(MyISAM), InnoDB 버퍼 풀(InnoDB 스토리지 엔진)과 같은 기능을 내장한다.

핸들러 API

MySQL 엔진의 쿼리 실행기에서 데이터 쓰기, 읽기 작업을 할 때 스토리지 엔진에 이러한 요청을 하는데, 이러한 요청을 핸들러 요청이라고 한다.
이 요청에서 사용되는 API들을 핸들러 API라고 한다.

MySQL 스레딩

MySQL 서버는 스레드 기반이며 멀티 스레드로 동작한다.

포그라운드 스레드

포그라운드 스레드는 MySQL 서버에 접속된 클라이언트 수만큼 있으며, 클라이언트가 요청하는 쿼리 문장을 처리한다.
작업을 마치고 커넥션이 종료되면 이 커넥션을 담당하던 스레드는 스레드 캐시로 돌아간다.
이 때 이미 스레드 캐시에 일정 갯수가 존재하면 스레드를 종료시켜 스레드 캐시를 유지할 수 있도록 한다.(thread_cache_size)

포그라운드 스레드는 MySQL 데이터 버퍼나 캐시로부터 가져오며, 없는 경우 직접 디스크 혹은 인덱스 파일로부터 데이터를 읽어와서 작업을 처리한다.

백그라운드 스레드

InnoDB의 백그라운드는 여러 처리를 수행한다.

  • 인서트 버퍼를 병합
  • 로그를 디스크로 기록
  • InnoDB 버퍼 풀의 데이터를 디스크에 기록
  • 데이터를 버퍼로 읽기
  • 잠금이나 데드락을 모니터링

데이터를 읽는 작업은 주로 클라이언트 스레드에서 처리되기 때문에 읽기 스레드는 많이 설정할 필요가 없지만 쓰기 스레드는 많은 작업을 백그라운드로 처리하기 때문에 일반적으로 2~4 정도를 설정하는 것이 좋다.

데이터의 쓰기 작업은 버퍼링(지연)되어 처리할 수 있지만 읽기 작업은 그렇지 않다. 이러한 이유로 InnoDB는 쓰기 작업 시 데이터가 디스크로 저장될 때까지 기다리지 않아도 된다.(버퍼에 작업이 적재되어있고, 처리되기 때문)

0개의 댓글

Powered by GraphCDN, the GraphQL CDN