Yomni's TIL Help

쿼리 실행 구조

2 query exec order

쿼리 파서

사용자의 쿼리 문장을 트리 형태로 분해 한다. 기본적인 문법 오류를 발견할 수 있다.

아래와 같은 로직으로 구동될 것으로 예상

  • SELECT 다음 컬럼명이 나온다. 공백(white space)를 기준으로 Select와 컬럼을 나눈다.

  • 컬럼은 콤마(,)를 기준으로 분리한다. 컬럼 사이에 있는 공백(white space)은 무시한다.

    • FROM 이란 키워드가 나올 때 까지 컬럼 리스트를 취합한다.

  • FROM 이란 키워드가 나오면 그 다음엔 [스키마명.]테이블명이 나온다.

  • ...

전처리기

파서 트리를 기준으로 구조적인 문제가 있는 지 확인한다.
테이블 이름이나, 컬럼 이름, 함수명 등에 대해 유효성 검사를 한다(validation)

옵티마이저 (진짜 매우 중요) ; 경영진

쿼리 실행 구조를 하나의 회사로 비유하면, 옵티마이저는 경영진에 속한다.

  • 비효율적인 쿼리를 효율적인 쿼리로 개선한다.

    • 이 과정에서 비용을 최적화 한다.

  • 실행 계획을 세운다.

대부분 쿼리 튜닝이라 함은, 옵티마이저가 실행계획을 잘 세울 수 있도록 가이드 하는 것이다.

Q) 비효율적인지 효율적인지 어떻게 알아?

  • 데이터 분포도, 인덱스, ... 등등 종합적으로 고려하여 판단한다.

실행 엔진(쿼리 실행기) ; 중간 관리자

쿼리를 실행한다. == 핸들러(스토리지 엔진) 에게 데이터를 가져오라고 시킨다.

결과를 요청한 사용자에게 돌려준다.

핸들러(스토리지 엔진) ; 실무진

실제 디스크에 저장되어 있는 데이터를 읽는다.

InnoDB의 경우

  • 단순히 디스크 I/O를 하는 것이 아니라, 여러 로그 - 버퍼풀 등을 활용하여 디스크 I/O를 최소화 하려고 한다.

  • 격리 수준을 다양화 하여 쓰는 동시에 이전 데이터를 조회할 수 있거나 여러 시나리오에서 효율적인 접근이 가능하다.

느낀점

  • 레이어드 아키텍처, SRP가 또 여기서 연계되어 생각난다.

  • 만약 맨 바닥부터 MySQL을 직접 만드는 상상을 해보게 되었다. 쿼리 파서에서는 신나게 String을 조작하고, 유효성 검사하고, ...

Last modified: 19 March 2025