☁️ 쿼리 실행 구조
사용자가 MySQL에 쿼리를 요청하면 MySQL은 아래의 그림과 같은 절차를 수행한다.
쿼리 파서
사용자의 요청으로 들어온 쿼리 문장을 토큰으로 분리하여 트리 형태의 구조(파서 트리)로 만들어 내는 작업을 수행한다. 이 때, 사용자가 요청한 쿼리의 기본 문법 오류가 발견되고 리턴된다.
전처리기
쿼리 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 문제점이 있는지 확인한다. 테이블 이름이나 컬럼, 내장 함수 같은 구문에 오류가 있는지 확인하고, 실제로 존재하는 테이블인지 권한상 접근 불가능한 테이블인지 판단 후 오류 검출 시 리턴한다.
옵티마이저
옵티마이저는 MySQL 엔진의 뇌와 같은 존재이다. 쿼리 문장을 더 저렴한 비용으로 빠르게 처리할 수 있는지를 판단하여 실행 계획을 세우고 효율적인 작업을 수립한다.
쿼리 실행기
옵티마이저에서 결정한 잡업을 스토리지 엔진을 통해 실행하는 역할을 수행한다.
스토리지 엔진
데이터를 디스크로 쓰거나 읽어오는 작업을 수행한다. 각 스토리지 엔진에 따라 처리하는 방식이 상이하다.
InnoDB의 포그라운드 스레드는읽기 작업에 대해 디스크까지의 접근이 허용되지만 쓰기 작업의 경우 버퍼 풀까지만 접근이 허용되고, 버퍼 풀의 데이터를 디스크에 저장하는 역할은 백그라운드 스레드가 수행한다.
반면에 MyISAM은 쓰기, 읽기 작업 모두 포그라운드 스레드가 수행하고, 디스크까지의 접근이 허용된다.
☁️ MySQL 8.0 변경점
쿼리 캐시 (MySQL 8.0 부터 삭제됨)
MySQL 8.0 이전에는 쿼리 캐시가 존재하여 SQL의 실행 결과를 저장해두고 동일한 SQL 요청이 실행되면 테이블을 읽지 않고 바로 캐싱하여 결과를 반환하는 작업을 수행했었다. 하지만 테이블과 쿼리 캐시의 동기화 문제때문에 성능 저하를 유발하고 많은 버그의 원인이 되기도 하여 8.0 이후 완전히 제거되었다.
트랜잭션 지원 메타데이터
서버 테이블 구조 정보등을 메타데이터라고 하는데 8.0 이전에는 파일 기반으로 이를 저장했다. MySQL 내부에 저장하는 형식이 아니었기에 트랜잭션을 지원하지 않았고, 테이블의 생성 또는 변경 도중 MySQL 서버가 비정상적으로 종료되는 경우 메타데이터의 정보의 일관성이 깨지는 문제가 있었다.
8.0 이후 메타데이터를 InnoDB의 테이블에 저장하도록 개선되었고, 메타데이터에 대한 트랜잭션이 지원되며, 비정상적인 종료에 의한 데이터의 일관성이 깨지는 문제가 해결되었다.
'Database > Real MySQL' 카테고리의 다른 글
MySQL 엔진과 InnoDB 엔진의 잠금 (1) | 2024.01.27 |
---|---|
트랜잭션(Transaction)과 격리 수준(Isolation level) (1) | 2024.01.27 |
InnoDB 스토리지 엔진 - 지원 기능 (1) | 2024.01.26 |
InnoDB 스토리지 엔진 - 버퍼 풀과 리두, 언두 로그 (1) | 2024.01.26 |
MySQL 아키텍처와 스레딩 (2) | 2024.01.25 |