본문 바로가기
CS 지식/CS 지식

[데이터베이스] MySQL 엔진 처리 동작 과정

by Max007 2024. 5. 9.
728x90

쿼리파서

[쿼리 파서]


쿼리파서는 쿼리를 요청 받았을 때 가장 먼저 작동하는 구간입니다. 사용자의 요청으로 들어온 SQL구문을 토큰으로 분리해 트리형태의 구조로 변경합니다. 쿼리파서는 쿼리를 파싱한후 SQL 구문의 문법오류 여부 확인합니다. 이후 전처리기로 보내게 됩니다.

 

전처리기

전처리기

전처리기는 SQL 쿼리의 유효성을 검증하는 중요한 단계입니다. 먼저, Parser가 만든 트리를 기반으로 SQL 구문의 유효성을 검사합니다. 각 토큰을 테이블이나 컬럼명, 내장 함수 등의 개체와 매핑하여 해당 객체의 존재 여부와 접근 권한을 확인합니다. 이 과정에서 권한이 없는 개체의 토큰은 걸러지게 됩니다.

 

옵티마이저

옵티마이져

옵티마이저는 SIUD와 같은 쿼리를 최적으로 실행하기 위한 실행 계획을 수립하는 프로세스입니다. 이때 비용 기반 최적화와 규칙 기반 최적화를 사용합니다. 비용 기반 최적화는 작업의 비용과 대상 테이블의 통계 정보를 활용하여 실행 계획을 수립합니다. 쿼리를 실행하여 걸린 시간 등의 통계를 바탕으로 실행 계획을 조정할 수 있습니다. 반면에, 규칙 기반 최적화는 옵티마이저에 내장된 우선 순위에 따라 실행 계획을 수립합니다. 이를 통해 쿼리를 다양한 형태로 변형하여 성능을 최적화할 수 있습니다. 예를 들어, 서브쿼리를 조인으로 변경하거나 조건절을 추가하여 실행 속도를 향상시킬 수 있습니다.

 

CBO vs RBO

비용 기반 옵티마이져는 해당 데이터베이스의 통계정보를 수집하여 통계정보를 기준으로 SQL 실행계획을 생성하는 옵티마이져입니다.
판단이 매우 규칙적이고 분명하여 사용자가 정확히 예측이 가능합니다. SQL 문장에 대한 여러가지 경우의 수 별로 처리시간에 비례한 비용을 산출해내고 이들 비용에서 가장 작은 비용을 갖는 플랜을 결정합니다. SQL 문장에 대한 여러가지 경우의 수별로 처리시간에 비례한 비용을 산출해내고 이들 비용에서 가장 작은 비용을 갖는 플랜을 결정합니다.

 

규칙 기반 옵티마이져는 사전에 실행할 SQL 문의 순서를 규칙으로 설정하여 그 규칙에 따라 SQL 문 실행 순서를 결정하는 옵티마이져입니다. 인덱스 구조나 비교연산자에 따른 우선순위를 기준으로 최적 경로를 설정합니다. 일반적으로 우선 순위가 높은 오퍼레이션은 우선순위가 낮은 오퍼레이션 보다 더 빨리 실행합니다.

 

EXPLAIN

EXPLAIN은 쿼리의 실행 계획을 확인하는 명령어입니다. 이를 통해 쿼리가 어떻게 실행되는지를 살펴볼 수 있습니다. 예를 들어, type이 "ALL"이라면 전체 테이블을 스캔하는 것이고, "ref"라면 인덱스를 사용하여 조인하는 것을 의미합니다. 이를 통해 쿼리의 성능을 분석하고 최적화할 수 있습니다.

 

explain
 
●select_type: 쿼리의 유형 - simple: 서브쿼리 없는 기본적인 SELECT 쿼리를 의미 - subquery: 서브쿼리가 포함함을 의미
●table: 쿼리에서 참조되고 있는 테이블의 이름
●partitions: 쿼리가 참조하는 파티션
ex) 큰 데이터베이스의 테이블을 더관리하기 쉽고 효율적으로 데이터를 처리할수 있도록 논리적으로 구분하는 방법 거래내역을 월별로 구분할때 p202401 p202402
●type: 조인 유형 또는 테이블 접근 방식.
- ALL: 전체 테이블 스캔, 즉 인덱스를 사용하지 않고 전체 테이블을 조회한다는 것을 의미
- ref: 인덱스를 사용하여 조인 하는 것을의미
●possible_keys: 쿼리 조건과 일치하는 사용 가능한 인덱스
●key: 실제로 쿼리에서 사용된 인덱스.
●key_len: 사용된 인덱스의 길이
●ref:  테이블 간의 조인을 수행할 때 인덱스를 사용하여 일치하는 값을 찾는 데 사용
●const: 테이블의 레코드 건수에 관계없이 쿼리가 프라이머리키나 유니크키 칼럼을 이용하는 WHERE 조건절을 가지는 것을 의미
●rows: 옵티마이저가 쿼리를 실행하기 위해 읽어야 할 것으로 예상하는 행의 수.
●filtered: 쿼리의 WHERE 조건을 통과할 것으로 예상되는 행의 백분율
●Extra: 쿼리 실행과 관련된 추가 정보

 

스토리지 엔진

스토리지 엔진

MySQL은 다양한 스토리지 엔진을 제공하여 데이터를 저장하고 관리합니다. 주요한 스토리지 엔진으로는 InnoDB, MyISAM 등이 있습니다. 각 스토리지 엔진은 고유한 특징을 가지고 있으며, 데이터베이스의 요구 사항에 맞게 선택하여 사용할 수 있습니다. 예를 들어, InnoDB는 트랜잭션 처리와 ACID 특성을 지원하여 대규모 트랜잭션 환경에서 안정성과 성능을 보장합니다.

MySQL은 이외에도 다양한 스토리지 엔진을 제공합니다. Memory 엔진은 데이터를 RAM에 저장하여 빠른 엑세스를 제공하고, CSV 엔진은 데이터를 텍스트 형식으로 저장하여 쉽게 읽고 쓸 수 있습니다. 또한, FEDERATED 엔진을 사용하여 원격 데이터베이스에 저장된 데이터에 접근할 수 있습니다. 이를 통해 MySQL은 다양한 환경에서 데이터를 효율적으로 관리할 수 있습니다.

 

MySQL의 스토리지 엔진은 중요한 구성 요소로, 데이터의 저장과 관리에 중요한 역할을 합니다. 각 스토리지 엔진은 고유한 특징을 가지고 있으며, 데이터베이스의 요구 사항에 맞게 선택하여 사용할 수 있습니다. 이를 통해 MySQL은 다양한 환경에서 안정성과 성능을 보장하며, 데이터를 효율적으로 관리할 수 있습니다.

 
728x90