MySQL Storage Engine 알아보기 - InnoDB

Kai·2023년 5월 3일
0

MySQL

목록 보기
6/15

☕ 시작


이번 글에서는 지난 글에 이어, MySQL을 뜯어보는 시간을 가져보도록 하겠다. 그 중에서도 스토리지 엔진(InnoDB)의 동작원리에 대해서 알아보자.


🤔 InnoDB?


MySQL 서버는 스토리지 엔진이 존재한다. 스토리지 엔진은 데이터를 디스크에 '쓰기'하거나 저장된 데이터를 '읽기'하는 역할을 한다.
스토리지 엔진은 여러 종류가 있고, InnoDB가 대표적으로 가장 많이 쓰인다.

InnoDB는 트랜잭션 기능을 제공하고 대용량의 데이터를 다루기도 좋다. 그 외에도 다양한 기능들을 제공하기 때문에, 가장 인기가 많다.



💻 InnoDB의 구조


InnoDB에 대해서 공부하다 보면, 가장 많이 마주칠 그림이다. ㅎㅎ
그림만 보면 굉장히 복잡해 보인다...

스토리지 엔진은 크게 In-Memory StructuresOn-Disk Structures로 구분할 수 있는데, 좀 더 상세하게 서술하자면 아래와 같이 정리할 수 있다.

In-Memory Structures

  • Buffer Pool
  • Change Buffer
  • Adaptive Hash Index
  • Log Buffer

On-Disk Sturctures

  • Tables
  • Indexes
  • Tablespaces
  • Doublewrite Buffer
  • Redo Log
  • Undo Logs

이제 하나 하나 좀 더 자세히 이야기해보도록 하겠다.


🔥 In-Memory Structures


1) Buffer Pool

  • 버퍼풀은 테이블 및 인덱스 데이터를 캐싱하는 메인 메모리 영역이다.
  • 쓰기 버퍼링 기능을 제공한다. 즉, 쿼리가 실행됐지만 아직 commit되지 않은 데이터들은 Buffer pool에서 들고 있게 된다는 것이다.
  • 쿼리가 실행됐는데, 해당하는 데이터들이 Buffer Pool에 없다면, 디스크에서 읽기/쓰기해서 가져오게 된다.

2) Change Buffer

  • 보조 인덱스 (Secondary Index)의 변화를 캐싱하는 메모리 영역이다. 쉽게 이야기하면, 어떤 데이터의 인덱싱된 외래키가 새롭게 생기거나 수정되거나 삭제되면 Change Buffer에 그 변화를 캐싱한다는 것이다.
  • 보조 인덱스와 관련된 데이터가 버퍼풀에 없는 상태에서 보조 인덱스에 변화가 생겼을 때, 이 변화를 캐싱한다.

3) Adaptive Hash Index

  • 자주 사용되는 컬럼을 해시로 정의해서 PK기반으로 생성된 Tree를 매번 스캔하지 않고도 데이터를 탐색할 수 있게 해주는 기능이다.
    자주 사용되는 컬럼에 대해서만 해시를 생성하므로, 성능 향상에 도움이 된다.

4) Log Buffer

  • MySQL서버에서 실행된 트랜잭션은 Redo Log에 기록이 되는데, 매번 기록하는 것은 성능상 문제가 될 수 있으므로 Log Buffer에 기록해뒀다가 한꺼번에 Redo Log에 기록을 한다.
    즉, Log Buffer는 Redo Log의 캐시와 같은 역할을 한다.

🔥 On-Disk Structures


1) Tables

  • 우리가 아는 DB의 테이블들을 이야기한다.
  • 테이블 정보는 .frm파일에 저장해서 관리한다.

2) Indexes

  • 인덱스의 종류에는 '클러스터 인덱스'와 '보조 인덱스(Secondary Index)'가 있다.
  • 클러스터 인덱스는 PK와 같은 의미의 용어이다.
  • 보조 인덱스는 '인덱스키와 PK의 조합'이다.
  • 보조 인덱스에서 PK를 찾고, 그 PK를 통해서 원하는 데이터를 찾는 식으로 데이터 탐색이 이루어진다.

3) Tablespaces

  • 테이블스페이스는 시스템 테이블스페이스, File-per-table 테이블스페이스, 임시 테이블스페이스 등등이 있다.
  • 시스템 테이블스페이스 : 시스템 전체에 대한 정보가 저장되는 파일이다. 데이터 Dictionary, Undo Log와 같은 것들을 저장한다.
  • File-per-table 테이블스페이스 : 이름에서도 유추할 수 있듯이 DB에 생성되어 있는 테이블 각각의 정보를 기록하는 파일이다. 데이터와 인덱스 정보가 기록이 되고, .idb확장자를 갖는다.

4) Doublewrite Buffer

  • 버퍼풀에서 데이터가 Flush되어 디스크에 저장될 때, 이중 쓰기 버퍼에도 데이터가 같이 기록이 된다.
  • 쉽게 얘기하면, 데이터의 복사본이라고 생각할 수 있고, 이는 예상치 못한 장애가 생겼을 때 안전하게 데이터를 복구하기 위함이다.

5) Redo Log

  • 트랜잭션의 내용을 기록하는 파일이다.
  • 혹시나 MySQL서버에 장애가 생겨서 MySQL서버의 메모리에 저장됐던 정보들이 모두 사라지면, Redo Log를 참고하여 장애 이전 시점으로 복구한다.

6) Undo Logs

  • 어떤 트랜잭션이 수행되기 이전의 데이터를 기록하는 파일이다.
  • 트랜잭션을 수행하고 해당 트랜잭션을 취소하는 상황처럼 트랜잭션이 수행되기 이전의 데이터가 필요한 경우를 위해서 존재한다.

☕ 마무리


이직을 준비하면서, 면접을 봤었는데 DB와 관련된 부분을 내가 너무 모르고 있다는 생각이 들어서 이렇게 DB를 학습해보는 시간을 가져봤다. ㅎㅎ

휴.. DB는 참.. 어려운 것 같다 ㅠㅠ

혹시나 잘못된 내용이 있다면 피드백해주면 감사하겠고 긴 글 읽어줘서 감사하다 🙏

그럼 20000 🤭


참고


0개의 댓글