SQL 수행 전체 프로세스
- 사용자가 DB에서 원하는 데이터를 가져오기 위해 SQL 문을 실행한다.
- 실행된 SQL 문은 MySQL 엔진에서 문법 에러가 있는지, DB에 존재하는 테이블 대상으로 SQL 문을 작성했는지와 같은 세부사항을 다양한 문법 및 구문으로 검사한다. (파서)
- 사용자가 요청한 데이터를 빠르고 효율적으로 찾아가는 전략적 계획을 수립한다. (옵티마이저)
- 수립한 계획을 토대로 스토리지 엔진에 위치한 데이터까지 찾아간 뒤 해당 데이터를 MySQL 엔진으로 전달한다.
- MySQL 엔진은 전달된 데이터에서 불필요한 부분을 필터링하고 필요한 연산을 수행한 뒤 사용자에게 최종 결과를 전달한다.
DB 엔진
스토리지 엔진
- 스토리지 엔진은 사용자가 요청한 SQL 문을 토대로 DB에 저장된 디스크나 메모리에서 필요한 데이터를 가져와서, 해당 데이터를 MySQL 엔진으로 보내준다.
- 일반적으로는 온라인 상의 트랜잭션 발생으로 데이터를 처리하는 OLTP 환경이 대다수인 만큼 주로 InnoDB 엔진을 사용한다.
- 그 밖에도 대량의 쓰기 트랜잭션이 발생하면 MyISAM 엔진을, 메모리 데이터를 로드하여 빠르게 읽는 효과를 내려면 Memory 엔진을 사용하는 식으로 응용하여 스토리지 엔진을 선택할 수 있다.
※ 참고: MariaDB 10.5 버전에는 오라클의 시퀀스 오브젝트와 유사하게 동작하는 Sequence 엔진을 가지고 있으며, MySQL과 MariaDB는 제공하는 엔진 목록이 일치하지 않는다.
MySQL 엔진
- MySQL 엔진은 사용자가 요청한 SQL 문을 넘겨받은 뒤 SQL 문법 검사와 적절한 오브젝트 활용 검사를 하고, SQL 문을 최소 단위로 분리하여 원하는 데이터를 빠르게 찾는 경로를 모색하는 역할을 수행한다.
- 이후 스토리지 엔진으로부터 전달받은 데이터를 대상으로 불필요한 데이터는 제거하거나 가공 및 연산한다.
- SQL 문의 시작 및 마무리 단계에 관여하며, 스토리지 엔진으로부터 필요한 데이터만을 가져오는 핵심 역할을 담당한다.
SQL 프로세스
SQL 문 수행 절차
- 사용자가 SQL 문을 수행하면, 파서는 MySQL이 이해할 수 있는 최소 단위로 구성요소를 분리하고 해당 구성요소를 트리로 만든다.
- 전처리기는 생성된 트리 결과를 토대로, 이미 만들어진 테이블이나 뷰 등으로 구성되지는 않는지, 존재하지 않는 열을 포함하지는 않는지, 조회 권한이 없는 테이블을 조회하는지 등의 유효성을 검증한다.
- 옵티마이저는 트리를 구성하는 오브젝트의 데이터를 효율적으로 가져오기 위해 시간은 적게 소요되면서도 비용 효율적인 경로로 데이터를 검색하는 방법에 관한 실행 계획을 수립한다.
- 엔진 실행기는 이전에 수립된 실행 계획으로 스토리지 엔진을 호출해 필요한 데이터를 가져오고, 가져온 데이터 중 불필요한 데이터를 필터링하여 사용자가 원하는 결과를 전달한다.
파서
- 파서는 MySQL 엔진에 포함되는 오브젝트로, 사용자가 요청한 SQL 문을 쪼개 최소 단위로 분리하고 트리를 만든다.
- 트리를 만드는 과정에서 문법 오류가 있는지 검토한다.
- 트리의 최소 단위는 >, <, = 등의 기호나 SQL 키워드로 분리한다.
- 만약 트리에서 허용되지 않는 문법이 포함된다면 에러 발생과 동시에 실행이 종료된다.
전처리기
- 전처리기는 MySQL 엔진에 해당하는 오브젝트로, 파서에서 생성한 트리를 토대로 SQL 문에 구조적인 문제가 없는지 파악한다.
- SQL 문에 작성된 테이블, 열, 함수, 뷰와 같은 오브젝트가 실질적으로 이미 생성된 오브젝트인지, 접근 권한은 부여되어 있는지 확인하는 역할
- 만약 유효하지 않은 오브젝트가 있거나 권한이 없는 오브젝트를 호출하면 바로 에러를 발생시켜 사용자에게 표시한다.
옵티마이저
- 옵티마이저는 MySQL의 핵심 엔진 중 하나로, 전달된 파서 트리를 토대로 필요하지 않은 조건은 제거하거나 연산 과정을 단순화한다.
- 또한 어떤 순서로 테이블에 접근할지, 인덱스를 사용할지, 사용한다면 어떤 인덱스를 사용할지, 정렬할 때 인덱스를 사용할지 아니면 임시 테이블을 사용할지와 같은 실행 계획을 수립한다.
- 실행 계획으로 도출할 수 있는 경우의 수가 지나치게 많을 때는 모든 실행 계획을 판단하지는 않으므로, 옵티마이저가 선택한 최적의 실행 계획이 항상 최상의 실행 계획은 아닐 수도 있다.
- 또한, 실행 계획을 수립하는 작업에서도 사용자의 대기 시간과 하드웨어 리소스를 점유하므로, 시간과 리소스에 제한을 두고 실행 계획을 선정해야 한다.
엔진 처리기
- 엔진 처리기는 MySQL 엔진과 스토리지 엔진 영역 모두에 걸치는 오브젝트로, 옵티마이저에서 수립한 실행 계획을 참고하여 스토리지 엔진에서 데이터를 가져온다.
- 이후 MySQL 엔진에서는 읽어온 데이터를 정렬하거나 조인하고, 불필요한 데이터는 필터링 처리하는 추가 작업을 수행한다.
- MySQL 엔진의 부하를 줄이려면 스토리지 엔진에서 가져오는 데이터양을 줄이는게 중요하다.
'Computer Science > Database' 카테고리의 다른 글
`이상현상과 정규화 (0) | 2022.02.22 |
---|---|
JOIN의 종류 (0) | 2022.02.19 |
`서브쿼리와 뷰 (0) | 2022.02.19 |
테이블과 키 (0) | 2022.02.19 |
`MySQL과 MariaDB (0) | 2022.02.17 |