SQL 에 사용자가 쿼리를 날리면 어떤 동작과정이 있을까?
너무 딥다이브 하게는 어려울꺼 같고, Real MySQL 을 보면서 간단한 동작을 공부했던걸 정리해보려고 한다.
위와 같이 사용자가 DB 에 쿼리를 날리는 상황이라고 해보자.
일단 대부분의 컴파일 언어처럼 SQL 도 쿼리 컴파일러를 통해서 SQL 쿼리를 트리형태로 파싱한다.
이 파싱해 내는 과정에서 기본 문법 오류들을 짚어낸다.
이해하기 쉽게 대략적으로 요런식이라고 그려보았다.
근데 틀린 내용이 있으니 감안하고, 대충 이런식으로 토큰 처럼 만든다고 이해를 해주면 좋을 것 같다.
그럼 다음단계로 넘어가면, 전처리기 과정이다.
전처리기는 첫번째 단계에서 만들어진 파서트리를 바탕으로 쿼리문장에 구조적인 문제가 있는지 확인한다.
각 토큰을 컬럼이나 테이블에 맵핑해 접근 권한등이 주어져있는지 등을 확인한다.
자세히 확인은 안해봤지만 공부하면서 우리가 예약어를 쓸때는 전처리기 과정에서 걸리지 않을까? 이런 생각을 했었다.
다음은 옵티마이저 단계이다.
옵티마이저는 MySQL 의 전자 두뇌와 같은 존재다. DBMS 의 핵심뇌라고 생각하면 된다.
간단히 내가 공부했던 바탕들을 떠올려보면, 옵티마이저는 통계자료를 만드는데 쉽게 말하면 자신이 어떤 쿼리를 효율적으로 실행하기 위한 판단자료를 가지기 위해서 통계자료를 만드는데, 이를 만드는 비용이 꽤 크다고 공부를 했었다.
또한 우리가 보는 쿼리플랜도 옵티마이저가 우리가 적은 쿼리를 어떻게 실행할지 결정내린것을 우리가 explain 을 통해서 볼 수 있는 것으로 알고 있다. 그래서 우리가 쓰는 hint 도 옵티마이저의 판단을 도와주기 위해 이 방향으로 가보자. 라는 식으로 옵티마이저를 도와주거나, 아니면 오히려 방해할 수도 있는 것이다.
다음은 실행엔진이다.
옵티마이저가 뇌라면 실행엔진은 그 명령을 받아 전기적 신호로 움직이는 손과 발이라고 볼 수 있다.
실행엔진은 핸들러와 긴밀한 연관을 맺고 있는데 이 부분은 쉽게 얘기해서 실행엔진은 상급자고, 핸들러는 실무자라고 생각하면 편하다.
예를 들면 InnoDB 테이블을 조작하기 위해서는 InnoDB Engine 이 Handler 가 된다.
예를 들면 실행엔진에게 아까 SELECT * FROM PERSON WHERE = "roach" 라는 쿼리를 실행시킨다고 해보자.
그러면 실행엔진은 일단 핸들러에게 임시 테이블을 만들라고 요청할 것이다.
그러면 메모리 상에 실행엔진이 임시테이블을 만들것이고, WHERE 절에 일치하는 레코드들을 읽어오라고 할 것 이다.
이 과정에서 가져온 데이터를 임시테이블에 저장할 것이고, 임시테이블에는 원하는 데이터가 남게 된다.
요건 나도 궁금한 것인데, MySQL 에서는 실제로 임시테이블을 만드는 방법이 있다.
CREATE TEMPORARY TABLE 이라는 명령어를 통해서 직접 만들수도 있다. 이게 실제로 핸들러가 사용하는 임시테이블인지는 모르겠으나, 만약 사용한다면 난수값을 테이블 이름이나 핸들러만이 알수있는 유니크한 값을 만들고 사용할것 같다는 생각이 들었다.
여하튼 이렇게 만들어진 임시테이블의 데이터를 유저가 사용할 수 있다!
제 생각과 지식이 들어간 글이라 틀린내용이 있을 수도 있습니다. 최대한 공부했던 내용을 적었으니 틀린 내용이 있다면 피드백 바랍니다.
'데이터베이스 > MySQL' 카테고리의 다른 글
인덱스 스캔 방식 (0) | 2021.11.08 |
---|---|
MySQL Index (0) | 2021.10.31 |
MySQL Lock System (0) | 2021.10.25 |
InnoDB 엔진의 특성 (2) | 2021.10.12 |
회사코드 DeadLock 처리 정리 (0) | 2021.09.20 |