MySQL 서버는 사람의 머리 역할을 하는 MySQL 엔진과 손발 역할을 하는 스토리지 엔진으로 구분할 수 있다.
MySQL 엔진은 클라이언트로부터의 접속 및 요청을 처리하는 커넥션 핸들러와 SQL 파서, 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. (SQL 문장을 분석하거나 최적화하는 등 두뇌 처리)
스토리지 엔진은 실제 데이터를 디스크 스토리지에 저장하거나 읽어오는 등 데이터를 읽고 쓰는 역할을 하며 MySQL 엔진의 쿼리 실행기에서 스토리지 엔진에 읽기 또는 쓰기 요청을 하는 것을 핸들러 요청이라 한다. (MySQL 엔진이 스토리지 엔진에게 데이터를 읽어오거나 저장하도록 명령하려면 반드시 핸들러를 통해야 한다)
MySQL 엔진은 하나, 스토리지 엔진은 여러 개를 동시에 사용할 수 있다.
MySQL의 메모리 공간은 글로벌 메모리와 로컬 메모리 영역으로 나뉘는데 글로벌 메모리 영역은 MySQL 서버가 시작되면서 운영체제로부터 할당되며 클라이언트 스레드의 수와 무관하게 보통 하나(2개 이상도 되긴 함)의 메모리 공간으로 모든 스레드에 의해 공유된다.
로컬(세션) 메모리 영역은 클라이언트 스레드가 쿼리를 처리하는데 사용하는 메모리 영역으로 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되지 않는다. 중요한 특징은 각 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않은 경우에는 MySQL이 메모리 공간을 할당조차도 하지 않을 수도 있다.
거의 대부분의 작업이 MySQL 엔진에서 처리되고, 마지막 데이터 읽기, 쓰기 작업만 스토리지 엔진에 의해 처리(group by, order by등의 복잡한 처리는 MySQL 엔진의 쿼리 실행기에서 처리)가 되는데 하나의 쿼리 작업에 있는 하위 작업들이 각각 어느 영역에서 처리되는지 구분할 줄 아는 것이 중요하다.
쿼리 파서는 사용자 요청으로 들어온 쿼리 문장을 MySQL이 인식할 수 있는 토큰 단위로 분리해서 트리 형태의 구조로 만들어낸다.
(이 과정에서 문법 오류가 발견된다.)
전처리기는 테이블 이름이나 칼럼 이름 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 접근 권한 등을 확인한다
옵티마이저는 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정하는 중요한 역할을 하며 DBMS의 두뇌에 해당한다. 어떻게 하면 옵티마이저가 더 나은 선택을 할 수 있도록 유도하는지 아는 것이 중요하다.
쿼리 캐시는 SQL의 실행 결과를 메모리에 캐시하는 것으로 매우 빠른 성능을 보이지만 테이블의 데이터가 변경되면 캐시에 저장된 결과 중에서 변경된 테이블과 관련된 모든 것을 삭제해야 한다. 이는 동시 처리 성능 저하와 많은 버그의 원인이 되기 때문에 MySQL 8.0으로 올라오면서 제거되었다.
데이터베이스 서버에서 테이블의 구조 정보와 스토어드 프로그램 등의 정보를 데이터 딕셔너리 또는 메타데이터라고 하는데 MySQL 8.0부터는 메타데이터와 MySQL 서버가 작동하는데 기본적으로 필요한 시스템 테이블 등을 InnoDB의 테이블에 저장해서 트랜잭션을 지원하도록 했다. (이전에는 메타데이터를 파일 기반으로 관리해서 MySQL 서버가 비정상으로 종료시 깨지는 문제 발생)
'데이터베이스' 카테고리의 다른 글
[Real MySQL] 인덱스 (0) | 2023.04.16 |
---|---|
[Real MySQL] MySQL의 격리 수준 (0) | 2022.12.03 |
[MyBatis] 마이바티스 스프링 연동 모듈 (0) | 2022.07.13 |
[DB 접근 기술2] MyBatis 기본 문법 (0) | 2022.06.22 |
[DB 접근 기술1] 스프링 데이터베이스 예외 추상화 (0) | 2022.06.19 |