DB
[DB]MySQL 아키텍처와 InnoDB스토리지 엔진 특징
마디니
2022. 3. 17. 20:54
반응형
MySQL 아키텍쳐
1.MySQL 접속 클라이언트
- 대부분 프로그래밍어에게 접속 api를 제공한다.
- Shell 스크립트를 통해서도 접속 가능
2.MySQL 엔진
- 클라이언트 접속과 SQL요청을 처리 한다.
- 쿼리파서, 전처리기, 옵티마이저, 실행엔진 등으로 이루어져 있다.
3.MySQL 스토리지 엔진
- 데이터를 실제로 디스크에 저장하거나, 디스크에 저장된 데이터를 읽어오는 역할을 담당
- 옵티마이저가 작성한 실행 계획에 따라서 스토리지 엔진을 적절히 호출해서 쿼리를 실행한다.
4.운영체제 파일 시스템과 하드웨어
- 실제 테이블 데이터와 로그 데이터를 파일로 저장한다.
쿼리 실행 과정
1.쿼리 캐시
- 사용자가 SQL요청을 Mysql로 보내면 쿼리 캐시(쿼리 요청결과를 캐싱하는 모듈)를 통해 동일한 SQL요청에 대한 결과를 즉시 받을 수 있다.
- 캐싱하고 있는 데이터의 테이블이 변경되면 캐싱데이터가 삭제되는데, 이때 쿼리 캐시에 접근하는 쓰레드에 락이 걸려서 성능저하가 발생 할 수 있다. (Mysql 8.0 쿼리캐시가 완전히 삭제)
2.쿼리파서
- SQL문장을 토큰으로 쪼개서 트리(Parse Tree)로 만든다.(이때 문법오류를 체크한다.)
3.전처리기
- Parse Tree를 기반으로 SQL문장 구조를 체크, Parse Tree의 토큰이 유효한지 체크
4.옵티마이저
- SQL실행을 최적화해서 실행 계획을 수립한다. 아래 두가지 방법을 사용한다.
- (방법1)규칙 기반 최적화 : 옵티마이저에 내장된 우선순위에 따라 실행 계획을 수립한다.
- (방법2)비용 기반 최적화 : 작업의 비용과 대상 테이블의 통계 정보를 활용해서 실행 계획을 수립한다.
5.쿼리 실행 엔진
- 옵티마이저가 만든 실행 계획대로 스토리지 엔진을 호출해서 레코드를 읽고 쓴다.
6.스토리지 엔진
- 쿼리 실행 엔진이 요청하는대로 데이터를 디스크로 저장하고 읽음
- 핸들러 API에 의해 동작 (핸들러라고도 불린다)
- 플러그인 형태로 제공되므로 사용자가 원하는 스토리지 엔진을 선택해서 사용할 수 있다.
MySQL스토리지 엔진
1.InnoDB스토리지 엔진
- 프라이머리 키에 의한 클러스터링
- 레코드를 PK순으로 정렬해서 저장
- PK를 통해서만 레코드에 접근 가능
- PK를 통한 범위 검색이 매우 빠르지만, 클러스터링 때문에 쓰기 성능 저하
- PK를 생성하지 않으면 내부적으로 PK를 자동생성해서 사용한다. (그리고 사용자는 이 PK를 직접 사용할 수 없다.)
- 트랜잭션 지원
- MVCC(트랜잭션 격리 레벨에 따라 조회되는 데이터가 달라지게 하는 기술)
- commit, rollback 제공,
- Undo Log
- 변경되기 이전 데이터를 백업
- 랜잭션 보장(롤백시 언두로그에 백업된 데이터 복원)
- 트랜잭션 격리 수준 보장(트랜잭션 격리 수준에 맞게 백업된 데이터 반환)
- 리두 로그(Redo Log)
- 변경된 데이터를 백업(Commit 완료된 데이터)
- 영속성 보장(서버 비정상 종료시, 리두 로그에 백업된 데이터 복원)
- MySQL이 비정상적으로 종료되면 리두로그를 통해 데이터 백업
- 레코드 단위 잠금
- 동시처리 성능이 좋다
- 레코드 자체를 잠그는 것이 아니라 인덱스를 잠근다.
- InnoDB버퍼풀
- 버퍼풀은 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐싱해 두는 공간
- SQL요청 결과를 일정한 크기의 페이지 단위로 캐싱한다.
- 변경된 데이터를 버퍼풀에 모았다가, 한 번에 디스크에 기록
- 어댑티브 해시 인덱스
- <인덱스키, 페이지 주소값>쌍으로 구성된 인덱스
- 페이지에 빠르게 접근하기 위해 사용
- 사용자가 자주 요청하는 데이터에 대해 InnoDB가 자동으로 만들어준다.
2.MyISAMDB스토리지 엔진
- 클러스터링, 트랜잭션, 외래키를 지원하지 않음
- 테이블 단위 잠금
- 키 캐시 사용(인덱스 정보만 버퍼링)
- 전문 검색, 공간 좌표 검색 기능 지원
우아한테크 영상을 보고 정리한 글입니다.
https://www.youtube.com/watch?v=vQFGBZemJLQ
반응형