MySQL 엔진, 스토리지 엔진
MySQL 엔진과 스토리지 엔진이 존재한다.
쿼리 파서
이 부분에서 기본 문법 오류는 이 과정에서 발견하고 사용자에게 오류 메세지를 전달하는 부분이다.
전처리기
내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인하는 과정을 이 단계에서 수행한다. 또한, 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지도 확인 하는 부분이다.
옵티마이저
사용자의 요청으로 들어온 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정하는 역할을 담당하고 사람이라고 치면 두뇌라고 한다.
쿼리 실행기
옵티마이저가 두뇌라고 하면 실행 엔진과 핸들러는 손과 발에 비유 할 수 있다.
예시로 옵티마이저가 GOURP BY 처리 하기 위해 임시 테이블을 사용하기로 결정했다면
1. 실행엔진이 핸들러에게 임시 테이블을 만들라고 요청
2. 다시 실행 엔진은 WHERE 절에 일치하는 레코드를 읽어오라고 핸들러에게 요청
3. 읽어온 레코드들을 1번에서 준비한 임시 테이블로 저장하라고 다시 핸들러에게 요청
4. 데이터가 준비된 임시 테이블에서 필요한 방식으로 데이터를 읽어 오라고 핸들러에게 다시 요청
5. 최종적으로 실행 엔진은 결과를 사용자나 다른 모듈로 넘김
즉, 실행 엔진은 핸들러에게 요청해서 받은 결과를 또 다른 핸들러의 요청의 입력으로 연결하는 역할을 수행한다.
핸들러 (스토리지 엔진)
실행 엔진의 요청에 따라 데이터를 디스크로 저장하고 디스크로부터 읽어 오는 역할을 담당.
쿼리 캐시
기존에 있던 쿼리 요청으로 데이터 받아오면 캐시에 저장한 뒤 이 데이터를 다시 요청 할때 캐시에서 주는 식인 쿼리 캐시가 존재하였다. 하지만 데이터가 바뀌게 되면 캐시에 있는 데이터와 일관성을 유지할수 없으므로 심각한 버그가 생기게 된다.
이러한 이유로 MySQL 8.0 으로 올라오면서 완전히 제거가 되었다.
스레드 풀
MySQL 서버 엔터프라이즈 에디션에서 스레드 풀 기능을 제공하지만, MySQL 커뮤니티 에디션은 스레드 풀 기능을 지원하지 않는다.
스레드 풀은 내부적ㅇ으로 사용자의 요청을 처리하는 스레드 개수를 줄여서 동시 처리되는 요청이 많다. 하더라도 MySQL 서버의 CPU 가 제한된 개수의 스레드 처리에만 집중할 수 있게 해서 서버의 자원 소모를 줄이는 것이 목적이다.
저도 Spring 때 스레드 풀만 늘리면 성능이 두배가 될줄 알았다.. 실제 서비스에서 눈에 띄는 성능 향상을 보여준 경우는 드물었다. 그래서 스레드 풀의 개수는 CPU 코어의 개수와 맞추는 것이 좋다.
thread_pool_max_threads 시스템 변수에 설정된 개수되로 스레드를 생성한다.
thread_pool_stall_limit 시간 동안 기다려야만 새로 들어온 요청을 처리 할 수 있다는 뜻이다.
스레드 풀 관련 내용 (추가)
- Percona Server의 스레드 풀 플러그인은 선순위 큐와 후순위 큐를 이용해 특정 트랜잭션이나 쿼리를 우선적으로 처리할 수 있는 기능도 제공한다.
- 이렇게 되면 성능 향상을 할수 있다.
출처 : Real MySQL 8.0 책을 보고 정리한 내용입니다.
'DB' 카테고리의 다른 글
MySQL 사용자 및 권한 (0) | 2024.07.26 |
---|---|
MySQL 변수들 (0) | 2024.07.19 |
PostgreSQL만의 함수 to_tsvector(), to_tsquery() (0) | 2023.09.07 |
PostgreSQL vs MySQL (0) | 2023.09.03 |
Mysql Load Data 대용량 데이터 삽입 (0) | 2023.08.08 |