본문 바로가기
개발공부 개발새발/DB

MySQL ) MySQL 엔진

by 휴일이 2023. 8. 31.

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 테이블에 저장하도록 개선됐다.

728x90