개발자는 기록이 답이다

MySQL엔진 아키텍처 - 쿼리 실행 구조 본문

Database/Real MySQL 8.0

MySQL엔진 아키텍처 - 쿼리 실행 구조

slow-walker 2024. 3. 19. 03:14

 

 

 

1. 쿼리파서

  • 사용자 요청으로 들오온 쿼리 문장을 토큰(MySQL이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조로 만들어내는 작업.
  • 쿼리 문장의 기본 문법 오류는 이 과정에서 발견되고 사용자에게 오류 메세지를 전달한다.

 

2. 전처리기

  • 파서과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에서 구조적인 문제점이 있는지 확인한다.
  • 각 토큰을 테이블 이름이나 칼럼 이름, 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근권한 등을 확인하는 작업을 수행한다
  • 실제 존재하지 않거나 권한 상 사용할 수 없는 개체의 토큰은 이 단계에서 걸러진다.

3. 옵티마이저

  • 사용자의 요청으로 드러온 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지 결정하는 역할
  • DBMS의 두뇌에 해당한다
  • SQL쿼리 파서 트리를 실행계획으로 변환한다.
  • 쿼리를 최적으로 실행하기 위한 실행 계획 수립
  • 쿼리 재작성, 테이블 스캔 순서 결정, 사용할 인덱스 선택
  • 비용 기반 최적화, 규칙 기반 최적화
    • 비용기반 최적화 : MySQL에 존재하는 다양한 통계 정보를 활용해서 실행 계획 수립 (대부분 DBMS가 사용)
    • 규칙 기반 취적화 : 동일한 SQL이라면 항상 동일한 실행 계획 수립

 

더보기

▶️ id 

 

실행계획을 살펴보면 id가 동일한 2개의 row가 있기 때문에 두 테이블은 join을 하는 형태로 실행이 된다는 것을 의미한다.

 

▶️ table 

 

테이블을 보면 coupon테이블과 event테이블을 읽는다는 것을 알 수 있는데, coupon테이블을 먼저 읽어서 driving테이블로 선정하고 event테이블은 나중에 읽는 driven 테이블로 선정한다는 것을 알 수 있다.

  • driving table : 실행 계획에서 먼저 액세스 되는 테이블, 이 테이블은 결과 집합을 생성하는 주제이며, 조인을 시작하는 지점
  • driven table : 드라이빌 테이브레 의해 선택된 행에 대해 조인되는 테이블. 드라이빙 테이블과 조인하여 드라이빙 테이블의결과에 따라 선택된다.

▶️ type 

  • cosnt : 상수 테이블을 의미하며 where절에서 상수 값을 사용하여 행을 찾는 경우에 발생
  • index : 인덱스를 사용하여 해을 찾고, 인덱스의 전체 또는 일부를 스캔하는 것을 의미한다
  • eq_ref : 유니크 또는 프라이머리 키를 사용하여 행을 하나만 찾는 경우에 발생

4. 실행 엔진

  • 옵티마이저가 두뇌라면 실행엔진과 핸들러는 손과 발에 비유할 수 있다
  • 옵티마이저가 만들어낸 실행 계획을 실행 엔진에게 전달한다.
  • 실행 계획대로 쿼리를 수행하기 위해 핸들러 API를 사용해서 스토리지 엔진과 지속적으로 통신

예를 들어 옵티마이저가 GROUP BY를 처리하기 위해 임시 테이블을 사용하기로 결정했다고 해보자

  1. 실행 엔진이 핸들러에게 임시 테이블을 만들라고 요청
  2. 다시 실행 엔진은 WHERE 절에 일치하는 레코드를 읽어오라고 핸들러에게 요청
  3. 읽어온 레코드들을 1번에서 준비한 임시 테이블로 저장하라고 다시 핸들러에게 요청
  4. 데이터가 준비된 임시 테이블에서 필요한 방식으로 데이터를 읽어오라고 핸들러에게 다시 요청
  5. 최종적으로 실행 엔진은 결과를 사용자나 다른 모듈로 넘김

즉, 실행 엔진은 만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러 요청의 입력으로 연결하는 역할을 수행한다.

 

5. 핸들러(스토리지 엔진)

  • MySQL의 가장 밑단에서 MySQL 실행엔진의 요청에 따라 데이터를 디스크로 저장하고, 디스크로부터 읽어오는 역할을 담당한다.
    • 실행엔진의 요청을 처리하기 위해 디스크로부터 데이터 읽기/쓰기
  • 핸들러는 결국 스토리지 엔진을 의미하며, MyISAM 테이블을 조작하는 경우 핸들러가 MyISAM스토리지 엔진이 되고, InnoDB테이블을 조작하는 경우에는 핸들러가 InnoDB 스토리지 엔진이 된다.
    • 여러개 사용할 수 있음

 

 

참고 자료

Real MySQL 8.0

https://www.youtube.com/watch?v=8PRkLItDwXQ