우아한테크코스 테코톡
릭의 MySQL 아키텍처
카테고리 : 우아한테크코스 테코톡
릭의 MySQL 아키텍처
시작하기 앞서
- MySQL 이라고 부르는 거는 MySQL 서버라고 부를 수 있다.
- 서버 안에는 두외의 역할을 하는 MySQL 엔진이 있다.
- 여러 개의 손발의 역할을 담당하는 스토리지 엔진으로 구성이 되어있다.
- 두뇌의 역할을 하는 MySQL 엔진과 스토리지 엔진은 핸들러 API를 통해서 서로 통신을 주고 받는다.
쿼리의 실행 과정
- 사용자가 방금과 같은 쿼리를 날리게 되면은 쿼리 파서가 먼저 요청을 수행한다.
1 쿼리 파서가 하는일
- SQL 문장을 트리의 형태로 파싱을 하게 되는데 이 트리 안에 들어 있는 각각의 요소들은 MySQL이 인지할 수 있는 최소한의 단위인 토큰이라고 부르는 단위로 파싱이 된다
- 사용자의 요청으로 들어온 SQL 구문을 토큰으로 분리해 트리 형태의 구조로 변경한다.
- SQL 구문의 문법 오류 여부를 확인
- 예외가 있다면은 사용자에게 예외 메세지를 반환하는 역할도 한다.
2 전처리기에게 파스 트리가 전달이 된다.
- 전처리기는 만약에 예약어를 제외한 토큰을 검사를 해서 실제로 데이터베이스 안에 객체가 존재하는지 그리고 그 객체의 사용자가 접근을 할 수 있는지 권한 같은 것들을 검증을 하는 역할을 수행 한다.
- Parser가 만든 트리를 기반으로 SQL 구문의 유효성 검증 수행
- 각 토큰의 테이블, 컬럼, 프로시저 등이 존재하는지 확인
- 객체의 접근 권한 확인
3 옵티마이저에게 파스 트리가 전달이 된다.
- 옵티마이저는 이러한 파스 트리를 실행 계획으로 바꾸는 역할을 한다.
- 아이디가 동일한 두 개 row가 있기 때문에 두 테이블은 조인을 하는 형태로 실행이 된다는 걸 의미한다.
- article 테이블과 members 테이블을 읽는다는걸 알 수 있다.
- article 테이블을 먼저 읽어서 드라이빙 테이블로 선정을하고 member 테이블은 나중에 읽는 드리븐 테이블로 선정을 한다는 것을 알 수 있다.
- 두 개를 인덱스 풀 스캔과 그리고 조인을 할 때 기본키를 참조하는 형태로 데이터를 읽어온다는 걸 알 수 있다.
- 두 테이블 모두 기본키를 사용해서 테이블을 읽어 온다는 걸 알 수 있다.
- 쿼리를 재작성하거나 테이블 스캔 순서를 결정하고 인덱스를 사용한다면은 어떤 인덱스를 사용할지 선태을 하면서 최적의 쿼리를 실행하기 위한 실행 계획 수립
- 쿼리 재작성, 테이블 스캔 순서 결정, 사용할 인덱스 선택
- 비용 기반 최적화, 규칙 기반 최적화
- 비용 기반 최적화: MySQL에 존재하는 다양한 통계 정보를 활용해서 실행 계획을 수립하게 되고
- 규칙 기반 최적화: 동일한 SQL이라면 항상 동일한 실행 계획을 수립하게 된다.
- MySQL을 포함해서 대부분의 RDBMS들은 비용 기반 최적화 방식으로 옵티마이저가 동작을 한다.
4 옵티마이저가 만들어낸 실행 계획은 스토리지 엔진에게 전달 된다.
- 실행 엔진을 실행 계획을 토대로 스토리지 엔진과 통신을 해서 데이터를 읽어오는 작업을 수행한다.
- 실행 계획대로 쿼리를 수행
- 핸들러 API를 사용해서 스토리 엔진과 지속적으로 통신
- 스토리지 엔진을 실행 엔지의 요청을 처리하기 위해서 디스크로 부터 데이터를 읽기 쓰기 작업을 하는 걸 주된 목적으로 역할 수행을 한다.
- 여러 개를 동시에 사용 가능
MySQL 엔진
- MySQL 엔진은 앞서 살펴본 파스 트리, 전처리기, 옵티마이저 등으로 이루어져 있고 SQL 인터페이스, 캐시와 버퍼 등으로도 구성이 되어 있다.
InnoDB 스토리지 엔진
- InnoDB 스토리지 엔진은 트랜젝션 그리고 버퍼풀, 클러스터링 인덱스, MVCC, 외래키, 데드락 감지 등의 특징이 있다.
- MySQL 8.0 버전 이후부터 InnoDB 스토리지 엔진을 기본 스토리지 엔진으로 사용을 하고 있고 MyISAM 이랑 가장 큰 차이점으로는 트랜젝션 지원 여부에 있다.
- MyISAM은 트랜잭션을 지원하지 않고 InnoDB는 트랜젝션을 지원한다.
- 먼저 트랜잭션 격리 레벌을 REPEATABLE READ로 설정을 하고 트랜젝션 시작
- SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
- 트랜젝션 아이디는 순차적으로 증가하는 값을 가진다.
- 버퍼 풀
- 테이터 캐싱
- 쓰기 버퍼링
- 데이터를 읽고 쓰는 작업을 빠르게 진행할 수 있도록 도와준다.
- MVCC
- MVCC라는 트랜잭션을 동시성을 제어하는 방법을 사용
- 하나의 레코드에 대해 여러 개의 버전을 관리
- 잠금 없는 일관된 읽기
- Undo log