DB

Real MySQL 개요

정한_s 2023. 10. 22. 09:53

mysql의 서버는 크게 mysql 엔진과 스토리지 엔진으로 구분할 수 있습니다.

 

mysql 엔진의 역할

사람으로 치면 머리에 해당하는 역할입니다. 쿼리를 파싱하고 쿼리를 최적화 하여 sql을 실행합니다.

스토리지 엔진의 역할

사람으로 치면 손과 발에 해당하는 역할입니다. mysql 엔진이 커넥터를 통해 스토리지 엔진에게 데이터 읽기/쓰기 명령을 보냅니다. 스토리지 엔진은 해당 명령을 수행합니다. 대표적인 스토리지 엔진은 InnoDB가 존재합니다

MySQL의 특징 중에 대표적인 것은 플러그인 모델입니다. 각각의 기능들을 플러그인 형태고 개발해서 사용할 수 있습니다. 따라서 사용자는 기본적인 기능 이외에도 부가적인 기능을 위해서 직접 개발을 할 수 도 있습니다. 대표적으로 스토리지 엔진에서는 InnoDB, My ISAM 등이 있습니다. 각 구현체에 따라 데이터 읽기/쓰기 처리 방식이 달라집니다.

 

스토리지 엔진 중 현재 Mysql의 기본인 InnoDB를 자세히 보겠습니다.

 

버퍼 풀

메모리에 데이터 및 인덱스 페이지등을 캐시하기 위해 사용됩니다. 디스크 I/O를 줄여 성능을 향상하기 위한 목적이 있습니다. 캐시된 데이터를 가지고 있는 데이터 페이지 버퍼, MVCC(Multi Version Concurrency Control)을 위해 변경된 데이터를 가지고 있는 언두 페이지, 디스크에 쓰기 지연을 할 수 있게 하는 체인지 버퍼등이 있습니다.

.tip MVCC란

데이터베이스에서 동시성 제어를 위한 메커니즘 중 하나입니다. 트랜잭션이 발생할 때 다수의 사용자가 동시에 데이터베이스에 엑세스 할 수 있도록 지원해줍니다.

주요한 아이디어는 트랜잭션 마다 특정 버전을 보게 해서, 다른 트랜잭션에서 변경이 현재의 트랜잭션에 즉시 반영되지 않도록 하는 것입니다. 이를 통해 트랜잭션이 독립적으로 실행 할 수 있습니다.

이를 구현하기 위해 데이터가 변경이 되면, 변경되기 이전의 데이터는 언두 영역으로 저장됩니다.

이전 데이터는 더 이상 필요로 하는 트랜잭션이 없을 때 삭제됩니다. 또한 데이터를 읽는 영역은 트랜잭션의 격리 수준 설정에 따라 달라집니다. (READ_COMMITED 이상의 격리 수준은 변경된 데이터를 언두영역에서 읽습니다)

 

로그 버퍼

로그 버퍼는 트랜잭션에 관련된 모든 변경을 메모리에 저장하는 역할을 합니다. 로그 버퍼에 기록된 변경 사항은 주기적으로 리두 로그 파일로 플러시 됩니다.

 

어댑티브 해시 인덱스

사용자가 수동으로 생성하는 인덱스가 아닌, 사용자가 자주 요청하는 데이터에 대해 자동으로 생성하는 인덱스입니다. B-Tree 검색 시간을 줄여주기 위해 도입되었습니다. 해시 인덱스는 ‘인덱스 키 값’과 저장된 ‘데이터 페이지 주소’의 쌍으로 관리됩니다. 다시 ‘인덱스 키 값’은 B-Tree 인덱스의 고유 번호(Id)와 ‘B-Tree 인덱스의 실제 키 값’ 조합으로 생성됩니다.

 

 

마지막으로 로그에 대해서 설명하겠습니다.

리두 로그는 시스템의 안정성과 복구를 위한 목적으로 사용되며, 언두 로그는 롤백과 오래된 데이터 버전을 제공하기 위해 사용됩니다.

  1. 리두 로그파일 (Redo Log File):
    • 목적: 시스템 장애나 비정상적인 종료 후 데이터베이스의 일관성을 복구하기 위해 사용됩니다.
    • 동작 방식: 트랜잭션이 수행되면서 발생하는 모든 변경사항은 먼저 로그 버퍼에 저장되고, 이후에 실제 데이터 파일에 반영됩니다.
    • 쓰기 시점:
      • 로그 버퍼가 가득 찼을 때.
      • 트랜잭션이 커밋되었을 때.
      • 체크포인트가 생성될 때.
      • InnoDB의 내부 타이머나 다른 조건에 의해 주기적으로 로그 버퍼의 내용이 플러시될 때.
    위의 조건 중 하나가 만족될 경우, 로그 버퍼의 내용이 리두 로그 파일로 쓰여집니다.
  2. 언두 로그 (Undo Log):
    • 목적: 롤백 연산을 수행하거나, MVCC에서 오래된 데이터 버전을 제공하기 위해 사용됩니다.
    • 동작 방식: 트랜잭션이 데이터를 변경할 때, 해당 데이터의 원래 상태는 언두 로그에 기록됩니다. 이 기록은 나중에 롤백이 필요할 때 또는 다른 트랜잭션이 오래된 데이터 버전을 요구할 때 사용됩니다.
    • 쓰기 시점:
      • 트랜잭션이 데이터를 변경할 때마다 즉시 언두 로그가 생성됩니다.
      • 언두 로그는 일반적으로 시스템 테이블스페이스나 별도의 언두 테이블스페이스에 저장됩니다.
    트랜잭션의 변경사항이 발생할 때마다 언두 로그는 즉시 기록됩니다.

Real MySQL 8.0 (https://www.yes24.com/Product/Goods/103415627)