SQL 실행순서 및 실행계획

Jeong Choi(최현정)·2023년 10월 28일
0

MySQL

목록 보기
1/1

우리가 쿼리문을 실행할 때 어떤 내부 동작으로 데이터베이스에 있는 데이터들을 뽑아오는 지 알고 계신가요?

MySQL에서 Query를 실행하면 아래 사진처럼 도식표로 표현해 볼 수 있습니다.

이 도식화를 한 줄 한 줄 순서대로 풀어보겠습니다.

실행 순서

1) 파서

사용자가 SQL 문을 실행합니다. 그럼 이 SQL 문을 받은 파서는 사용자가 작성한 SQL문을 쪼개 최소 단위로 분리하며 트리 구조로 만듭니다.

2) 전처리기

파서에서 생성된 이 트리 구조를 기반으로 전처리기는 이 트리 구조를 확인하면서 구조적인 문제가 없는 지 확인합니다. 구체적으로 말하자면 해당 테이블과 컬럼, 등이 실제로 존재하는 지 구성요소들과 권한, 유효성 등을 확인합니다.

만약 유효하지 않는 구성요소나 권한이 없는 요소들이 있으면 바로 에러를 발생시킵니다.

3) 옵티마이저

전처리기를 무사히 통과하면 옵티마이저가 실행됩니다. 바로 여기가 핵심이라고 볼 수 있습니다.

옵티마이저는 트리 구조로 되어있는 요소들의 데이터들을 효율적으로 가져오기 위해 시간은 적게 소요되면서도 비용 효율적인 경로로 데이터를 검색한 방법에 관한 실행계획을 수립합니다.

실행계획은 만능이 아니다.

옵티마이저는 실행 계획으로 도출할 수 있는 경우의 수가 많을 경우에는 실행 계획을 수립하고 비용을 산정하여 최적의 실행 계획을 선택하기까지 시간이 오래 걸리기 때문에 모든 실행 계획을 수립하지 않습니다.

즉, 옵티마이저가 선택한 실행 계획은 항상 완벽하지 않을 수도 있다는 가능성이 존재합니다.

또한 실행 계획을 수립한다는 자체만으로도 사용자의 대기 시간, 하드웨어 리소스를 점유하기 때문에 시간과 리소스에 제한을 두고 실행 계획을 선정하는 것이 중요합니다.

5) 엔진 실행기

실행계획을 수립하면 엔진 실행기는 이 계획으로 스토리지 엔진을 호출해 필요한 데이터들을 가져옵니다.

필요한 데이터들을 전달 받은 엔진 실행기는 불필요한 데이터들을 필터링해 사용자에게 원하는 데이터들을 전달합니다.

MySQL의 부하를 줄이기 위해서는?

엔진 실행기는 스토리지 엔진에서 받아온 데이터들을 정렬, 조인, 필터링 등 추가 작업을 합니다.

즉, MySQL 엔진의 부하를 줄이기 위해서는 스토리지 엔진에서 가져오는 데이터들의 양을 줄이는 게 매우 중요합니다.

profile
Node와 DB를 사랑하는 백엔드 개발자입니다:)

0개의 댓글