Dev/DB

SQL 처리 과정

풋데브 2024. 1. 18. 17:09

 

개요


우리가 데이터를 조회하거나 데이터를 삽입, 수정, 삭제할 때 쓰는 SQL을 실행하면 내부에서는 어떻게 처리 될까? 

 

이 부분에 대해 내부적으로 처리단계를 공부하고자 이 글을 작성하게 되었다.

 

Parsing (파싱)


우리가 SQL을 실행하면 먼저 SQL 파서가 해당 SQL이 유효한지 체크한다. 동시에 MySQL 서버가 이해할 수 있는 방식으로 SQL 문장을 이루는 개별 구성요소를 분석하고 파싱해서 파싱 트리 (내부적인 구조체)를 만든다. 

 

이 과정에서 사전에 정의된 문법이 틀리진 않았는지 Syntax Check를 하고 쿼리가 올바른 의미인지 Semantic Check 를 해서 2단계를 거치게 된다.

 

Optimization (최적화)


해당 과정에서는 SQL 옵티마이저가 일을 수행하게 된다.

 

첫번 째로 파싱된 SQL을 좀 더 일반적이고 표준적인 형태로 변환한다. 

 

그러고나서 옵티마이저가 쿼리를 가장 효율적으로 수행할 수 있는 방법을 결정하게 된다. 이 과정에서 여러 실행 계획이 고려되고, 최적의 실행 계획이 선택된다.

 

이 과정에서는 크게 다음과 같은 내용을 처리하게 된다.

 

  • 불필요한 조건 제거 및 복잡한 연산의 단순화
  • 여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
  • 각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정
  • 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정

 

해당 부분들을 결정하고 나면 실행 계획이 만들어지게 된다. 하지만 실제로 이 쿼리를 실행하는 것은 MySQL 엔진이 아니다.

 

Execution (실행)


 

파싱된 SQL은 스토리지 엔진이 건네받아 수행하게 된다. 이때는 필요에 따라서 디스크를 조회해 명령에 맞게 데이터를 처리한다.

 

만약 조회 명령이라면 레코드들이 반환될 것이고 이 레코드들을 다시 MySQL 엔진에 건네준다.

 

해당 레코드로 조인을 하거나 정렬을 하는 작업을 다시 수행하게 된다.