본문 바로가기
CS/데이터베이스

MySQL 소개 - 02. MySQL 아키텍처 소개

by 컴쏘 2023. 6. 4.
728x90

3 Tier 아키텍처

클라이언트는 서버에 데이터를 요청 → 서버는 데이터베이스에게 데이터를 요청

데이터베이스

데이터베이스는 파일을 관리하는 서버

클라이언트는 json을 통해서 서버에게 데이터를 요청 → 서버는 SQL을 통해서 MySQL 서버에 데이터를 요청 (MySQL 입장에서 본다면 서버는 클라이언트와 같은 역할)

MySQL 서버

MySQL 내부에서는 MySQL 엔진 → 스토리지 엔진 → 운영체제 → 디스크를 거쳐 데이터를 탐색하고 그 결과를 돌려줌

  • MySQL 엔진 : 판단과 명령을 하는 두뇌
  • 스토리지 엔진 : 판단을 수행하는 역할

MySQL 엔진

MySQL 엔진은 쿼리 파서, 전처리기, 옵티마이저, 쿼리 실행기로 이루어져 있음

  • 쿼리 파서 : SQL을 파싱하여 Syntax Tree를 만듦 → 이 과정에서 문법 오류 검사가 이루어짐
  • 전처리기 : 쿼리 파서에서 만든 Tree를 바탕으로 전처리 시작테이블이나 칼럼 존재 여부, 접근 권한 등 Semantic 오류 검사
  • 쿼리 파서와 전처리기는 컴파일 과정과 매우 유사하지만, SQL은 프로그래밍 언어처럼 컴파일 타임때 검증 할 수 없어 매번 구문 평가를 진행해야 함

쿼리 파서 예시

옵티마이저

  • 쿼리를 처리하기 위한 여러 방법들을 만들고, 각 방법들의 비용 정보와 테이블의 통계 정보를 이용해 비용을 산정
  • 테이블 순서, 불필요한 조건 제거, 통계 정보를 바탕으로 전략을 결정 (실행 계획 수립) → 옵티마이저가 생각하기에 가장 최적이라고 생각되는 방법을 선택하는 역할을 가지고 있음
  • 옵티마이저가 어떤 전략을 결정하느냐에 따라 성능이 많이 달라진다.
  • 가끔씩 성능이 나쁜 판단을 해 개발자가 힌트를 사용해 도움을 줄 수 있다. → explain이라는 명령을 통해 옵티마이저가 어떤 방법을 결정했는지 확인할 수 있는 쿼리가 있음

쿼리 실행기

  • 쿼리 실행기는 옵티마이저가 결정한 계획대로 스토리지 엔진에 요청을 하는 역할 → 이때 Handler API 사용
    • 스토리지에 요청을 하는 것 → Handler 요청
    • Handler API를 만족하는 스토리지 엔진만 구현할 수 있다면 어떤 식이든 직접 구현하여 스토리지 엔진을 추가하여 사용할 수 있음

쿼리 캐시가 주는 인사이트

  • MySQL 5.0까지는 쿼리 캐시라는 것이 있었음
  • 8.0 대에 들어와서 쿼리 캐시는 폐기됨
    • 쿼리 캐시는 데이터를 직접 캐싱하는 것이기 때문에 만약 테이블의 데이터가 변경이 되면 캐시도 같이 변경되어야 함
    • 이 과정에서 생기는 문제가 쿼리 캐시가 주는 이점보다 더 컸기 때문에 폐기가 됨

cf) Oracle

  • 소프트 파싱 : SQL, 실행 계획을 캐시에서 찾아 옵티마이저 과정을 생략하고 실행 단계로 넘어감
  • 하드 파싱 : SQL, 실행 계획을 캐시에서 찾지 못해 옵티마이저 과정을 거치고 나서 실행 단계로 넘어감

정리

  • MySQL에는 소프트 파싱이 없음
    • 하지만 5 버전까지는 쿼리 캐시가 있었음
    • 쿼리 캐시는 SQL에 해당하는 데이터를 저장하는 것
    • 쿼리 캐시는 데이터를 캐시하기 때문에 테이블의 데이터가 변경되면 캐시의 데이터도 함께 갱신시켜줘야 함
  • Oracle에는 소프트 파싱이 존재
    • 실행 계획까지만 캐싱
    • 하지만 모든 SQL과 맵핑해 데이터까지 캐싱하지는 않음 (힌트나 설정으로 가능하긴 함)
  • MySQL의 쿼시 캐리, Oracle의 소프트 파싱 모두 성능 최적화를 위해 캐시라는 기술을 도입한 사례
    • 그러나 캐시의 범위가 다르다.
    • 캐시를 도입할 때는 항상 만료 정책을 고려해야 함
    • 쿼리 캐시는 소프트 파싱에 비해 조회 성능이 더 높지만, 캐시 데이터 관리에 더 높은 비용이 들어감
  • 모든 기술은 트레이드 오프이다. → 이 경우는 캐시의 범위를 어떻게 잡느냐에 따라 조회와 성능 사이의 문제이다.

스토리지 엔진

  • 디스크에서 데이터를 가져오거나 저장하는 역할
  • MySQL 스토리지 엔진은 플러그인 형태로 Handler API 만 맞춘다면 직접 구현해서 사용할 수 있다.
  • InnoDB, MyIsam 등 여러개의 스토리지 엔진이 존재
  • 8.0대 부터는 InnoDB 엔진을 디폴트

InnoDB

  • 핵심 키워드 : Clustered Index, Redo - Undo, Buffer pool

2023 KAKAO Tech Campus_BackEnd 필수 과정
DB(MySQL) 강의 정리 내용입니다.
728x90