강의를 듣던 중 MySQL 서버의 내부를 소개해주는 내용이 있어 정리하고자 한다.
MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)이다. MySQL은 웹 애플리케이션을 위한 데이터베이스로 특히 많이 사용된다.
MySQL 아키텍처
MySQL 엔진 내부
그러면 MySQL 엔진의 내부는 다음과 같이 쿼리 파서, 전처리기, 옵티마이저, 쿼리실행기를 거쳐서 스토리지 엔진으로 넘어간다.
해당 글에서는 MySQL 엔진 내부에서 어떠한 역할을 하는지 확인하려한다.
쿼리파서
- SQL을 파싱하여 Syntax Tree를 만든다.
- 이 과정에서 문법 오류 검사가 이루어진다.
전처리기
- 쿼리파서에서 만든 Tree를 바탕으로 전처리 시작한다.
- 이블이나 컬럼 존재 여부, 접근권한 등 Semantic 오류 검사를 진행한다.
쿼리파서와 전처리기는 컴파일 과정과 매우 유사하지만, SQL은 프로그래밍 언어처럼 컴파일 타임때 검증할 수 없어 매번 구문 평가를 진행한다.
옵티마이저
- 쿼리를 처리하기 위한 여러 방법들을 만들고, 각 방법들의 비용 정보와 테이블의 통계정보를 이용해 비용을 산정한다.
- 테이블 순서, 불필요한 조건 제거, 통계정보를 바탕으로 전략을 결정한다. (실행 계획 수립)
- 옵티마이저가 어떤 전략을 결정하느냐에 따라 성능이 많이 달라진다.
- 가끔씩 성능이 나쁜 판단을 해 개발자가 힌트를 사용해 도움을 줄 수 있다.
MySQL 캐시
- MySQL 5.0 까지는 쿼리 캐시라는 것이 있었으나, 8.0대에 들어와서는 쿼리 캐시가 폐기되었다.
파싱
- 소프트 파싱: SQL, 실행 계획을 캐시에서 찾아 옵티마이저 과정을 생략하고 실행 단계로 넘어간다.
- 하드 파싱: SQL, 실행 계획을 캐시에서 찾지못해 옵티마이저 과정을 거치고나서 실행 단계로 넘어간다.
MySQL에는 소프트 파싱이 없다. 하지만, 5버전 까지는 쿼리 캐시가 있었다. 쿼리 캐시는 SQL에 해당 데이터를 저장하는 것인데 데이터를 캐시하기 때문에 테이블의 데이터가 변경되면 캐시의 데이터도 함께 갱신시켜줘야한다.
Oracle에는 소프트 파싱이 존재한다. 실행계획까지만 캐싱을 진행하고, 모든 SQL 매핑하여 데이터까지 캐싱하지는 않는다. 하지만, 힌트나 설정으로 가능하다.
쿼리 캐시 결론
- MySQL의 쿼리캐시, Oracle의 소프트 파싱 모두 성능 최적화를 위해 캐시라는 기술을 도입한 사례이다. 하지만, 캐시의 범위가 각 다르다. 캐시를 도입할때는 항상 만료 정책을 고려해야하며 쿼리캐시는 소프트 파싱에 비해 조회성능은 더 높지만 캐시 데이터 관리에 더 높은 비용이 들어간다.
스토리지 엔진
- 디스크에서 데이터를 가져오거나 저장하는 역할을 한다.
- MySQL 스토리지 엔진은 플러그인 형태로 Handler API만 맞춘다면 직접 구현해서 사용할 수 있다.
- InnoDB, MyIsam 등 여러개의 스토리지 엔진이 존재한다.
- 8.0 버전 부터는 InnoDB 엔진이 디폴트이다.
InnoDB
- InnoDB는 MySQL의 기본 스토리지 엔진입니다. 이 엔진은 트랜잭션-세이프(transaction-safe) 기능을 제공하며, 대규모 데이터베이스 시스템에서 높은 성능과 확장성을 제공하기 위해 설계되었습니다.
- 트랜잭션 지원: InnoDB는 완전한 ACID(원자성, 일관성, 고립성, 지속성) 호환 트랜잭션을 지원합니다. 이는 트랜잭션 중 하나라도 실패하면 변경 사항을 롤백(undo)하고, 모든 트랜잭션이 성공적으로 완료되면 커밋(commit)하는 기능을 의미합니다.
- 행 수준 잠금: InnoDB는 동시성을 높이기 위해 행 수준의 잠금을 지원합니다. 이는 여러 사용자가 동시에 다른 행에 접근할 수 있게 해주어 성능을 향상시킵니다.
- 외래 키 지원: InnoDB는 외래 키(foreign key) 제약 조건을 지원합니다. 이는 한 테이블의 데이터가 다른 테이블의 데이터에 의존할 때 데이터 무결성을 보장하는 데 도움이 됩니다.
- MVCC(Multi-Version Concurrency Control): InnoDB는 MVCC를 사용하여 여러 트랜잭션이 동시에 같은 데이터에 접근할 수 있도록 합니다. 이는 읽기와 쓰기 동작간의 잠금 경합을 줄이며, 동시성을 높이는 데 도움이 됩니다.
- 크래시 복구 기능: InnoDB는 트랜잭션 로그와 체크포인트를 사용하여 시스템 장애 후에도 데이터를 안전하게 복구할 수 있습니다.
Reference.