카테고리 없음2020. 12. 30. 10:55

MariaDB / MySQL 쿼리 실행 구조

 

 

[쿼리의 실행 과정]

1. SQL 파싱(SQL Parsing)

  : 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MariaDB 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다.

    MariaDB 엔진에서 처리

 

2. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.

  - 불필요한 조건의 제거 및 복잡한 연산의 단순화

  - 여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정

  - 각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정

  - 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정

  MariaDB 엔진에서 처리

 

3. 두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.

  - 수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고, MariaDB 엔진에서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업을 수행한다.

 MariaDB 엔진 + 스토리지 엔진이 동시에 참여해서 처리

 

[쿼리 실행 순서]

1. 클라이언트는 서버로 SQL문을 전송한다.

2. 서버는 쿼리 캐시를 확인하여 캐시에 저장된 데이터가 있다면 저장된 결과를 반환한다. 그헣지 않으면 다음 단계로 통과시킨다.

3. 서버는 구문 분석 및 전처리기에서 쿼리에 구조적인 문제가 없는지 확인 후 옵티마이저는 SQL을 최적화한다.

4. 쿼리 실행 엔진은 스토리지 엔진 API를 호출하여 계획을 실행한다.

5. 서버는 클라이언트에게 결과를 반환한다.

 

 

[Parser]

Parser는 사용자 요청으로 들어온 쿼리 문장을 토큰(SQL엔진이 인식할 수 있는 형태)으로 분리해 트리 형태의 구조로 만드는 작업을 의미한다. 쿼리 문장의 기본 문법 오류는 이 과정에서 발견되어 사용자에게 오류 메시지를 전달하게 된다.

 

 

[Preprocessor]

파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인한다. 각 토큰을 테이블 이름이나 컬럼 이름 또는 내장 함수와 같은 개체를 매핑하여 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인하는 과정을 수행한다. 실제 존재하지 않거나 권한이 없는 객체의 토큰은 이 단계에서 걸러진다.

 

 

[Optimizer]

옵티마이저는 요청된 쿼리 문장을 어떻게 처리할지를 결정하는 두뇌 역할을 한다. 옵티마이저는 가장 적은 비용으로 가장 빠르게 처리할 수 있는 방법을 결정하기 위해 다양한 통계 자료를 활용한다. 옵티마이저의 선택에 따라서 쿼리 성능에 영향을 미치므로 특성을 잘 이해할 필요가 있다.

 

 

[Query execution engine]

옵티마이저가 최적의 실행 계획을 결정하면 이를 직접 실행하는 부분을 담당한다. 스토리지 엔진의 API를 호출한다.

 

 

참고 : 

sungwookkang.com/m/155?category=618835

 

MySQL/MariaDB 아키텍처 – 쿼리 실행 구조

MySQL/MariaDB 아키텍처 – 쿼리 실행 구조 Version : Mariadb 5.5.4.2-WinX64 MySQL / MariaDB 쿼리 실행 구조에 대해서 알아본다. 쿼리 실행 구조는 타 DB와 거의 동일하다. [쿼리 실행 순서] 클라이언트는 서버..

sungwookkang.com

RealMariaDB (이성욱 저) P.117 ~ P.122)

Posted by 자수성가한 부자