개요
우리가 데이터를 조회하거나 데이터를 삽입, 수정, 삭제할 때 쓰는 SQL을 실행하면 내부에서는 어떻게 처리 될까?
이 부분에 대해 내부적으로 처리단계를 공부하고자 이 글을 작성하게 되었다.
Parsing (파싱)
우리가 SQL을 실행하면 먼저 SQL 파서가 해당 SQL이 유효한지 체크한다. 동시에 MySQL 서버가 이해할 수 있는 방식으로 SQL 문장을 이루는 개별 구성요소를 분석하고 파싱해서 파싱 트리 (내부적인 구조체)를 만든다.
이 과정에서 사전에 정의된 문법이 틀리진 않았는지 Syntax Check를 하고 쿼리가 올바른 의미인지 Semantic Check 를 해서 2단계를 거치게 된다.
Optimization (최적화)
해당 과정에서는 SQL 옵티마이저가 일을 수행하게 된다.
첫번 째로 파싱된 SQL을 좀 더 일반적이고 표준적인 형태로 변환한다.
그러고나서 옵티마이저가 쿼리를 가장 효율적으로 수행할 수 있는 방법을 결정하게 된다. 이 과정에서 여러 실행 계획이 고려되고, 최적의 실행 계획이 선택된다.
이 과정에서는 크게 다음과 같은 내용을 처리하게 된다.
- 불필요한 조건 제거 및 복잡한 연산의 단순화
- 여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
- 각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정
- 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정
해당 부분들을 결정하고 나면 실행 계획이 만들어지게 된다. 하지만 실제로 이 쿼리를 실행하는 것은 MySQL 엔진이 아니다.
Execution (실행)
파싱된 SQL은 스토리지 엔진이 건네받아 수행하게 된다. 이때는 필요에 따라서 디스크를 조회해 명령에 맞게 데이터를 처리한다.
만약 조회 명령이라면 레코드들이 반환될 것이고 이 레코드들을 다시 MySQL 엔진에 건네준다.
해당 레코드로 조인을 하거나 정렬을 하는 작업을 다시 수행하게 된다.
'Dev > DB' 카테고리의 다른 글
트랜잭션과 격리수준 (1) | 2024.02.08 |
---|---|
이상현상 (Anomaly) (0) | 2024.02.01 |
디스크 읽기 방식과 쿼리 성능 개선 (1) | 2024.01.25 |