MySQL 엔진
쿼리를 작성하고 튜닝할 때 필요한 기본적인 엔진 독특한 구조를 가지고 있어 다른 DBMS에 비해 혜택도 많지만 문제되지 않을 것들이 문제가 되기도 한다.
커넥션 핸들러
접속 및 쿼리 요청을 처리.
옵티마이저
SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 담당.
핸들러 API
핸들러 요청에 사용되는 API
핸들러 요청
MySQL 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽을 때 각 스토리지 엔진에 쓰기, 읽기를 요청하는 것.
MySQL 스레딩 구조
MySQL 서버는 스레드 기반으로 작동한다.
포그라운드 스레드 | 사용자 요청 처리 | 적다. 공장. |
백그라운드 스레드 | 실제 요청 작업 | 많다. 일꾼들. |
포그라운드 스레드 (사용자 스레드)
- 서버에 접속된 클라이언트 수만큼 존재.
- 쿼리 문장 처리. (읽기 담당)
- 사용자가 작업을 마치고 커넥션을 종료하면 스레드 캐시로 되돌아감.
- 스레드 캐시에 이미 일정 개수 이상의 스레드가 있다면 스레드 종료.
- 스레드 캐시에는 일정 개수의 스레드만 존재하게 한다.
- 데이터를 데이터 버퍼나 캐시에게 가져옴.
- 버퍼나 캐시에 없다면 직접 디스크의 데이터나 인덱스 파일에서 읽어옴.
백그라운드 스레드
- 인서트 버퍼를 병합하는 스레드
- 데이터를 버퍼로 읽어오는 스레드
- 잠금이나 데드락을 모니터링하는 스레드
- 로그를 디스크로 기록하는 로그스레드
- InnoDB 버퍼 풀 데이터를 디스크에 기록하는 쓰기스레드
쓰기
아주 많은 작업을 백그라운드에서 처리.
- 데이터 쓰기 작업은 지연될 수 있다.
- 일반 상용 DBMS 와 InnoDB 에서는 쓰기를 버퍼에서 일괄 처리한다.
읽기
주로 클라이언트 스레드에서 처리.
- 읽기는 절대 지연되어선 안 된다.
메모리 할당 및 사용 구조
클라이언트 스레드 수와 무관하게 하나의 메모리 공간만 할당하며, 모든 스레드에 의해 공유된다.
- 테이블 캐시
- InnoDB 버퍼 풀
- InnoDB 어댑티브 해시 인덱스
- InnoDB 리두 로그 버퍼
로컬 메모리 영역(세션 메모리 영역)
클라이언트 스레드가 쿼리를 처리(읽기)하는데 사용한다.
- 정렬 버퍼(Sort buffer)
- 조인 버퍼
- 바이너리 로그 캐시
- 네트워크 버퍼
특징
- 스레드별로 독립적으로 할당, 절대 공유되지 않는다.
- 쿼리 용도별로 필요할 때만 공간이 할당.
- 필요하지 않으면 메모리 공간을 할당조차 하지 않을 수도 있다.
플러그인 스토리지 엔진 모델
스토리지 엔진만 있는 게 아니라 전문 검색 엔진을 위한 검색어 파서, 인증을 위한 엔진 등도 플러그인으로 구현되어 제공된다.
MySQL 엔진 | 사람 |
스토리지 엔진 | 자동차 |
핸들러
어떤 기능을 호출하기 위해 사용하는 운전대 역할을 하는 객체.
- MySQL 엔진이 스토리지 엔진을 조정하기 위해 핸들러를 사용한다.
- 반드시 핸들러를 통해 조정해야 한다.
- Group By 나 Order By 등의 복잡한 처리는 MySQL 엔진 “쿼리 실행기” 에서 한다.
✅ 쿼리 작업이 MySQL 엔진 영역에서 처리되는지 스토리지 엔진 영역에서 처리되는지 구분할 줄 알아야 한다.
컴포넌트
기존 플러그인 아키텍처를 대체하기 위해 지원하는 아키텍처. MySQL 서버 기존의 플러그인의 다음과 같은 단점을 보완해준다.
- 플러그인끼리는 통신이 불가하다.
- 서버 변수나 함수를 직접 호출해서 안전하지 않다.(캡슐화 안 됨)
- 상호 의존 관계를 설정할 수 없어 초기화 어려움.
쿼리 실행 구조
쿼리 파서
쿼리 문장을 *토큰으로 분리해 트리 형태 구조로 만들어낸다. 이 과정에서 기본 문법 오류가 발견됨.
*MySQL이 인식할 수 있는 최소 단위의 어휘 또는 기호
전처리기
쿼리 문장 구조의 문제점(객체 존재 여부 또는 접근 권한 확인)을 확인한다.
옵티마이저
쿼리 문장을 어떻게 빠르게 처리할지 결정하는 역할. DBMS 의 두뇌. (겁내 중요하다.)
실행 엔진
만들어진 계획대로 각 핸들러에게 요청 후, 받은 결과를 또 다른 핸들러 요청에 입력해 연결한다.(서비스)
핸들러(스토리지 엔진)
MySQL 서버의 가장 밑단에서 실행 엔진의 요청에 따라 움직인다. 스토리지 엔진.
- 실행 엔진의 요청에 따라 데이터를 디스크로 저장
- 디스크로부터 읽기
복제 (Replication)
서버를 복제하는 것. 매우 중요하다. 별도로 다뤄야 할 정도.
쿼리 캐시
장점 | 단점 |
SQL 실행 결과를 메모리에 캐시, 동일 SQL 쿼리가 실행되면 테이블을 읽지 않고 즉시 결과 반환 | 테이블 데이터가 변경되면 캐시에 저장된 결과 중에 변경된 테이블과 관련된 것들은 모두 삭제해야 한다. |
→ 매우 빠른 성능 ! | → 심각한 동시 처리 성능 저하, 많은 버그의 원인 |
동시처리 성능 저하와 많은 버그의 원인으로 MySQL 8.0 으로 올라오며 완전히 제거됐다.
스레드 풀
내부적으로 사용자의 요청을 처리하는 스레드 개수를 줄여서 서버의 자원 소모를 줄이는 목적으로 이용.
- 실제 서비스에서 눈에 띄는 성능 향상을 보여주는 경우는 드물다.
- 동시에 실행 중인 스레드들을 CPU가 최대한 잘 처리해내는 수준으로 줄여서 빨리 처리하게 하는 기능.
- CPU 시간을 제대로 확보하지 못하면 쿼리 처리가 더 느려지기도…
- 제한된 수의 스레드만으로 CPU가 처리하도록 유도하면 오버헤드를 낮출 수 있다.
Percona Server
percona server 의 스레드 풀은 CPU 코어 개수만큼 스레드 그룹을 생성한다.
이미 스레드 풀이 처리 중인 작업이 있다면
- 시스템 변수에 설정된 개수만큼 추가로 더 받아들인다.
- 이 값이 너무 크면 스케줄링할 스레드가 많아짐. 스레드풀이 비효율적으로 작동한다.
스레드 그룹의 모든 스레드가 일을 처리하고 있다면
- 해당 스레드 그룹에 새로운 작업 스레드를 추가할지
- 기존 작업 스레드가 처리를 완료할 때까지 기다릴지 결정
선순위 큐와 후순위 큐
특정 트랜잭션이나 쿼리를 우선 처리할 수 있는 기능! 쿼리를 재배치한다.
트랜잭션 지원 메타데이터
스키마 변경 중간에 DB나 테이블이 깨져도 완전 실패로 초기화됨! 테이블의 구조 정보나 스토어드 프로그램의 코드 정보를 InnoDB 테이블에 저장하도록 개선됐다.
'개발공부 개발새발 > DB' 카테고리의 다른 글
DB ) 모두 성공하지 않으면 모두 실패한다. 트랜잭션입니다. (0) | 2024.11.24 |
---|---|
MySQL ) InnoDB 스토리지 엔진 (0) | 2023.08.31 |
MySQL ) MySQL 아키텍처 ?! (0) | 2023.08.31 |
MySQL ) 사용자 및 권한과 역할 (0) | 2023.08.18 |
DB ) 잠금(MySQL 기준) (0) | 2023.08.18 |