본문 바로가기
엑셈 경쟁력/DB 인사이드

DB 인사이드 | MySQL Architecture - 5. SQL 처리과정

by EXEM 2022. 6. 30.

본 문서에서는 Client가 Query를 전달한 후 내부적인 처리 과정에 대해 알아보도록 하겠습니다.

 

Query Cache

먼저 Query를 분석하기 전에 MySQL Server는 Query Cache를 확인합니다. Query Cache는 Select문에 대한 전체 결과 집합을 저장하고 있습니다.

Client가 Query 수행 시 제일 먼저 거치는 단계로, Query를 분석하기 전에 MySQL Server는 Query Cache를 참조합니다. Client가 이미 캐시에 있는 것과 동일한 Query를 실행하면 Server는 SQL Parser, Optimizer 단계를 건너뛰고 결과를 직접 반환합니다.

📢 테이블의 Data가 변경되면 Query Cache의 내용 역시 달라지므로 변경된 테이블과 관련된 정보를 모두 삭제해야 했습니다. 이는 심각한 동시 처리 성능 저하를 유발하고 많은 버그의 원인이 되었기에 MySQL 8.0으로 올라오면서 Query Cache는 MySQL Server의 기능에서 완전히 제거되었습니다.

 

Parser

Query Cache에서 동일한 결과값을 반환하지 않는 Query로 확인될 때 처음으로 수행하는 단계는 Parsing 단계입니다. Client가 작성한 SQL문이 MySQL에서 사용할 수 있는 문법을 따르는지 확인하며, DB 내부적으로 해당 구문을 처리할 수 있도록 분리하여 Parse Tree를 생성합니다.

 

Preprocessor

Parsing단계를 거쳐 문법에 이상이 없다면 추가로 의미 분석을 진행합니다.

  • SQL문이 작업 대상 테이블에서 수행가능한 구문인지 확인합니다.
  • (ex. 테이블과 컬럼이 있는지 확인하고 이름과 별칭을 확인하여 컬럼 참조가 모호하지 않은지 확인합니다.)
  • SQL문을 수행할 수 있는 권한을 가지고 있는지 확인합니다.

 

Query Optimizer

Query Optimizer는 해당 Query를 효율적으로 수행할 수 있도록 DB 내부 언어로 가공하는 단계입니다. Preprocessor 단계까지 마치면, 생성된 Parse Tree가 유효하다고 판단하여 Query 실행계획을 생성할 준비를 합니다. Query는 다양한 방법으로 실행될 수 있지만 최적의 옵션을 찾는 것이 바로 Query Optimizer의 역할입니다.

일반적인 RDBMS의 경우 효율적인 실행계획을 세우기 위해 성능(비용)을 기반으로 계획하는 CBO와 정해진 규칙을 기반으로 하는 RBO 중 하나를 사용합니다. 이 중 MySQL은 CBO를 기본으로 Query Optimizer가 동작하며, 여기에서 산출하는 비용(Cost)의 기본 단위는 4 kb(1 페이지의 Data를 읽는데 소비하는 비용)입니다. 이때, 캐싱 효과는 추정치에 포함하지 않으며 모든 과정이 디스크 I/O 작업을 발생시킨다고 가정하여 비용을 계산합니다. (테이블 또는 인덱스 당 Page 수 또는 인덱스의 카디널리티, Row와 Key의 길이, Key의 분포 등 다양한 요소를 기반으로 합니다.)

📢 Query를 실행한 다음 Last_query_cost라는 Status Variable를 확인하면, Optimizer가 Query에 대해 추정한 비용을 확인할 수 있습니다.

 

Query Execution Engine

Query Execution Engine이란 Query Optimizer에 의해 생성된 실행계획대로 Query를 실행하는 역할을 수행하며, 실행계획에 따라 더이상 체크할 Row가 없을 때까지 반복합니다. 특히, 해당 단계에서는 실제 Data를 보관하는 스토리지 엔진과 지속적으로 Handler API Calls을 주고받습니다.

 

Storage Engines

Handler API를 통해 Query Execution Engine과 통신하며, Query Execution Engine의 요청에 따라 Data를 디스크에 저장하거나 읽어 오는 역할을 담당합니다. (MyISAM 테이블의 경우는 MyISAM 스토리지 엔진, InnoDB 테이블을 처리하는 경우에는 InnoDB 스토리지 엔진을 가리킵니다.)

 

Result

Query 실행 후 Client에 응답하는 단계입니다. (Query Cache를 사용 중이라면, MySQL은 이 단계에서 Result를 저장합니다.)

MySQL Server는 Query의 결과를 생성하고 Array Size 단위로 Client에 Data를 전달합니다.

 

 

 

기획 및 글 | 기술기획팀

이미지 제작 | 디자인그룹 이민석

 

 

 

댓글2

  • 궁금이 2022.07.06 15:30

    오라클의 library cache같은 역할은 없는걸까요?
    특히 mysql8 부터 query_cache기능이 삭제되었고, 있어도 그전 버전에서도 사용이 권고 되지 않았는데
    mysql은 sql 문이 들어오면 무조건 다 하드파싱을 하게 되는걸까요??
    답글

    • EXEM 2022.07.07 11:37 신고

      PostgreSQL와 MySQL은 Oracle처럼 SQL 관련 정보를 저장하기 위한 Global한 공유 메모리 영역이 존재하지 않습니다. 대신 Prepare Statement(Prepare ~ Execute) 기능을 통해 변수값만 변경되는 동일 패턴의 SQL은 비슷한 효과를 낼 순 있지만, 해당 정보가 Session 간 공유되지는 않습니다. 또한 Deprecate 된 Query Cache 기능의 경우 엄밀히 말하면 Parsing 단계를 단축하기 위한 목적이 아니므로 Oracle의 Result Cache 기능과 비교 가능합니다.