Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
MySQL엔진 아키텍처 - 쿼리 실행 구조 본문
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를 처리하기 위해 임시 테이블을 사용하기로 결정했다고 해보자
- 실행 엔진이 핸들러에게 임시 테이블을 만들라고 요청
- 다시 실행 엔진은 WHERE 절에 일치하는 레코드를 읽어오라고 핸들러에게 요청
- 읽어온 레코드들을 1번에서 준비한 임시 테이블로 저장하라고 다시 핸들러에게 요청
- 데이터가 준비된 임시 테이블에서 필요한 방식으로 데이터를 읽어오라고 핸들러에게 다시 요청
- 최종적으로 실행 엔진은 결과를 사용자나 다른 모듈로 넘김
즉, 실행 엔진은 만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러 요청의 입력으로 연결하는 역할을 수행한다.
5. 핸들러(스토리지 엔진)
- MySQL의 가장 밑단에서 MySQL 실행엔진의 요청에 따라 데이터를 디스크로 저장하고, 디스크로부터 읽어오는 역할을 담당한다.
- 실행엔진의 요청을 처리하기 위해 디스크로부터 데이터 읽기/쓰기
- 핸들러는 결국 스토리지 엔진을 의미하며, MyISAM 테이블을 조작하는 경우 핸들러가 MyISAM스토리지 엔진이 되고, InnoDB테이블을 조작하는 경우에는 핸들러가 InnoDB 스토리지 엔진이 된다.
- 여러개 사용할 수 있음
참고 자료
Real MySQL 8.0
https://www.youtube.com/watch?v=8PRkLItDwXQ
'Database > Real MySQL 8.0' 카테고리의 다른 글
InnoDB 스토리지 엔진 아키텍처 (1) (0) | 2024.03.19 |
---|---|
Real MySQL 8.0 - 트랜잭션과 잠금 (2) MySQL 엔진 잠금 (1) | 2023.10.21 |
Real MySQL 8.0 - 트랜잭션과 잠금 (1) 동시성관리 (0) | 2023.10.15 |