MySQL Server 구조와 Query 실행 구조

joonan·2024년 12월 13일

DataBase

목록 보기
1/1
post-thumbnail

MySQL Server 구조


MySQL Server 는 크게 MySQL EngineStorage Engine 으로 구성되어 있습니다.

MySQL Engine

MySQL Engine 은 Client 가 요청한 SQL 문장을 분석하고 최적화 하는 등 DBMS 의 두뇌 역할을 합니다.

MySQL Engine 은 다음 요소들로 구성되어 있습니다.

Query Parser

query parser 는 사용자의 요청으로 들어온 query 문을 token 단위로 분리하여 이를 트리로 만드는 역할을 합니다. 이 과정에서 기본 문법 오류가 발견되며 사용자에게 에러 메시지를 전달하게 됩니다.

전처리기

Query Parser 가 만든 트리를 기반으로 문장에 구조적인 문제점이 있는지 확인하는 역할을 합니다. 각각의 토큰을 테이블, 칼럼, 내장함수와 같은 개체랑 매핑시켜 해당 객체의 존재 여부와 접근 권한등을 확인합니다. 실제로 존재하지 않거나 접근 권한이 없는 토큰일 경우 해당 과정에서 걸러지게 됩니다.

Optimizer

Optimizer 는 사용자로 부터 입력된 쿼리를 저렴한 비용으로 가장 빠르게 처리하는 방법을 결정하는 역할을 담당합니다.

실행 엔진

실행 엔진은 Optimizer 에서 결정한 계획대로 Handler (Storage engine) 를 동작시키는 역할을 담당합니다. 따라서 실행 계획에 따라 각 핸들러에게 요청을 한 후 이 결과를 다른 핸들러에게 전달하여 최종 결과를 만드는 역할을 합니다.

Storage Engine (Handler)

MySQL Engine 은 두뇌역할을 하는 반면 실제 데이터를 저장소에 저장하거나 읽는 작업은 Storage Engine 이 담당합니다. 이를 Handler 라고도 합니다. InnoDB, MyISAM 등 많은 종류의 Storage Engine 이 있습니다.

create table foo_table (fd1 int, fd2 int) engine=INNODB;

MySQL Server 에서 MySQL Engine 은 단 하나이지만 Storage Engine 은 여러개를 동시에 사용할 수 있습니다. 따라서 table 을 생성할 때 Storage Engine 을 지정할 경우 해당 테이블의 읽기와 쓰기 작업은 해당 Storage Engine 을 통해 수행됩니다.

이렇게 여러개의 Storage Engine 을 사용하며, 각각의 테이블 마다 다른 Storage Engine 을 사용할 수 있는 이유는 Plugin Model 덕분입니다. 따라서 기본적으로 제공되는 plugin 대신 상황에 맞게끔 plugin 을 개발하여 직접 사용할 수도 있습니다.

engine 조회

show engines;

위 명령어를 실행할 경우 설치된 MySQL 서버에서 어떤 Storage Engine 을 지원하는지 확인할 수 있습니다.

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster         | NO      | Clustered, fault-tolerant tables                               | NULL         | NULL | NULL       |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| ndbinfo            | NO      | MySQL Cluster system information storage engine                | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

위 테이블의 칼럼 중 Support 칼럼의 값은 다음 4가지값을 가질 수 있습니다.

  • YES : MySQL Server 에 해당 Storage Engine 이 포함되어 있고 사용가능한 상황
  • DEFAULT : 'YES' 와 동일한 상태이지만 필수 Storage Engine을 의미. 해당 엔진이 없을 경우 MySQL 이 시작하지 않을 수 있음
  • NO : 현재 MySQL Server 에 포함되어 있지 않음
  • DISABLED : MySQL Server 에는 포함되어 있지만 파라미터에 의해 비활성화 된 상황

쿼리 실행 구조

사용자가 쿼리를 날렸을 경우 MySQL 서버 내부중 어디서 어떤 역할을 하는지 알아보겠습니다.

  1. 사용자가 쿼리를 MySQL Server 로 날립니다.
  2. 쿼리 파서는 전달받은 SQL 문을 트리 형태로 파싱합니다.
  3. 전처리기는 트리의 구조적인 문제를 체크 합니다. 즉 접근 권한과 테이블이 존재하는지를 판단합니다.
  4. 옵티마이저는 쿼리 변환, 비용 최적화, 실행 계획 수립등의 작업을 진행합니다.
  5. 쿼리 실행기는 옵티마이저가 짠 실행 계획을 기반으로 핸들러, 즉 Stroage Engin 의 Handler Api 를 통해 읽기 및 쓰기 작업을 진행하여 결과를 생성합니다.
  6. 해당 결과를 사용자에게 전달합니다.

즉 위 흐름을 보았을 때 대부분의 작업은 MySQL Engine 에서 처리됩니다. 하지만 데이터를 직접적으로 읽고 쓰는 작업은 Storage Engine 이 담당합니다.

profile
끄적 끄적

0개의 댓글