우아한테크코스 테코톡

릭의 MySQL 아키텍처

https://youtu.be/8PRkLItDwXQ

릭의 MySQL 아키텍처

시작하기 앞서

  • MySQL 이라고 부르는 거는 MySQL 서버라고 부를 수 있다.
  • 서버 안에는 두외의 역할을 하는 MySQL 엔진이 있다.
  • 여러 개의 손발의 역할을 담당하는 스토리지 엔진으로 구성이 되어있다.
  • 두뇌의 역할을 하는 MySQL 엔진과 스토리지 엔진은 핸들러 API를 통해서 서로 통신을 주고 받는다.

쿼리의 실행 과정

  • img.png
  • 사용자가 방금과 같은 쿼리를 날리게 되면은 쿼리 파서가 먼저 요청을 수행한다.

1 쿼리 파서가 하는일

  • SQL 문장을 트리의 형태로 파싱을 하게 되는데 이 트리 안에 들어 있는 각각의 요소들은 MySQL이 인지할 수 있는 최소한의 단위인 토큰이라고 부르는 단위로 파싱이 된다
    • 사용자의 요청으로 들어온 SQL 구문을 토큰으로 분리해 트리 형태의 구조로 변경한다.
    • SQL 구문의 문법 오류 여부를 확인
      • 예외가 있다면은 사용자에게 예외 메세지를 반환하는 역할도 한다.

2 전처리기에게 파스 트리가 전달이 된다.

  • 전처리기는 만약에 예약어를 제외한 토큰을 검사를 해서 실제로 데이터베이스 안에 객체가 존재하는지 그리고 그 객체의 사용자가 접근을 할 수 있는지 권한 같은 것들을 검증을 하는 역할을 수행 한다.
    • Parser가 만든 트리를 기반으로 SQL 구문의 유효성 검증 수행
    • 각 토큰의 테이블, 컬럼, 프로시저 등이 존재하는지 확인
    • 객체의 접근 권한 확인

3 옵티마이저에게 파스 트리가 전달이 된다.

  • 옵티마이저는 이러한 파스 트리를 실행 계획으로 바꾸는 역할을 한다.
    • img.png
      • 아이디가 동일한 두 개 row가 있기 때문에 두 테이블은 조인을 하는 형태로 실행이 된다는 걸 의미한다.
      • article 테이블과 members 테이블을 읽는다는걸 알 수 있다.
        • article 테이블을 먼저 읽어서 드라이빙 테이블로 선정을하고 member 테이블은 나중에 읽는 드리븐 테이블로 선정을 한다는 것을 알 수 있다.
      • 두 개를 인덱스 풀 스캔과 그리고 조인을 할 때 기본키를 참조하는 형태로 데이터를 읽어온다는 걸 알 수 있다.
      • 두 테이블 모두 기본키를 사용해서 테이블을 읽어 온다는 걸 알 수 있다.
  • 쿼리를 재작성하거나 테이블 스캔 순서를 결정하고 인덱스를 사용한다면은 어떤 인덱스를 사용할지 선태을 하면서 최적의 쿼리를 실행하기 위한 실행 계획 수립
  • 쿼리 재작성, 테이블 스캔 순서 결정, 사용할 인덱스 선택
  • 비용 기반 최적화, 규칙 기반 최적화
    • 비용 기반 최적화: MySQL에 존재하는 다양한 통계 정보를 활용해서 실행 계획을 수립하게 되고
    • 규칙 기반 최적화: 동일한 SQL이라면 항상 동일한 실행 계획을 수립하게 된다.
    • MySQL을 포함해서 대부분의 RDBMS들은 비용 기반 최적화 방식으로 옵티마이저가 동작을 한다.

4 옵티마이저가 만들어낸 실행 계획은 스토리지 엔진에게 전달 된다.

  • 실행 엔진을 실행 계획을 토대로 스토리지 엔진과 통신을 해서 데이터를 읽어오는 작업을 수행한다.
  • 실행 계획대로 쿼리를 수행
  • 핸들러 API를 사용해서 스토리 엔진과 지속적으로 통신
  • 스토리지 엔진을 실행 엔지의 요청을 처리하기 위해서 디스크로 부터 데이터를 읽기 쓰기 작업을 하는 걸 주된 목적으로 역할 수행을 한다.
  • 여러 개를 동시에 사용 가능

MySQL 엔진

  • img.png
  • MySQL 엔진은 앞서 살펴본 파스 트리, 전처리기, 옵티마이저 등으로 이루어져 있고 SQL 인터페이스, 캐시와 버퍼 등으로도 구성이 되어 있다.

InnoDB 스토리지 엔진

  • img.png
  • InnoDB 스토리지 엔진은 트랜젝션 그리고 버퍼풀, 클러스터링 인덱스, MVCC, 외래키, 데드락 감지 등의 특징이 있다.
  • MySQL 8.0 버전 이후부터 InnoDB 스토리지 엔진을 기본 스토리지 엔진으로 사용을 하고 있고 MyISAM 이랑 가장 큰 차이점으로는 트랜젝션 지원 여부에 있다.
    • MyISAM은 트랜잭션을 지원하지 않고 InnoDB는 트랜젝션을 지원한다.
  • 먼저 트랜잭션 격리 레벌을 REPEATABLE READ로 설정을 하고 트랜젝션 시작
    • SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
    • img.png
    • 트랜젝션 아이디는 순차적으로 증가하는 값을 가진다.
  • 버퍼 풀
    • 테이터 캐싱
    • 쓰기 버퍼링
    • 데이터를 읽고 쓰는 작업을 빠르게 진행할 수 있도록 도와준다.
  • MVCC
    • MVCC라는 트랜잭션을 동시성을 제어하는 방법을 사용
    • 하나의 레코드에 대해 여러 개의 버전을 관리
    • 잠금 없는 일관된 읽기
    • Undo log

© 2020. All rights reserved.

SIKSIK