InnoDB Storage Engine

이재민·2023년 11월 15일

InnoDB는 MySQL의 기본 Storage Engine입니다.
개발자가 주로 사용하는 MySQL 데이터베이스의 대표 기능들(Transaction, lock ..)을 InnoDB에서 제공하기에 InnoDB에 대해 알아보려고 합니다.

InnoDB란

InnoDB는 MySQL에서 기본으로 사용하고 있는 Storage Engine입니다.
아래 설명할 여러 장점들을 통해 데이터를 효율적으로 검색 및 관리하는 기능을 제공합니다.

장점

1. Primary Key 클러스터링

InnoDB의 모든 테이블은 기본적으로 Primary Key를 기준으로 Clustering되어 저장됩니다.
즉, Primary Key 값의 순서대로 디스크에 저장됩니다. 결과적으로 쿼리의 실행 계획에서 Primary Key는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정됩니다.
InnoDB Storage Engine과 달리 MyISAM Storage Engine은 Clustering Key를 지원하지 않습니다.
그래서 MyISAM 테이블에서는 Primary Key와 Secondary Index는 구조적으로 차이가 없습니다.

2. 외래 키 지원

외래 키데 대한 지원은 InnoDB Storage Engine 레벨에서 지원하는 기능이기에 MyISAM, MEMORY 테이블에서는 사용할 수 없습니다.
외래 키가 복잡하게 얽힌 경우에는 스키마 변경 관련 작업에 실패하는 경우가 종종 있는데, 이럴 경우 foreign_key_checks 시스템 변수를 OFF로 설정하면 외래 키 체크를 일시적으로 멈출 수 있습니다.
하지만 해당 옵션은 GLOBAL한 설정이기에 현재 세션에서만 사용할 수 있도록 해야되고, 제약사항에 위반할 수 있기에 주의해서 사용해야 한다.

3. MVCC(Multi Version Concurrency Control)

일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능이며, MVCC의 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공하는 데 있습니다.
InnoDB는 언두 로그(Undo log)를 이용해서 해당 기능을 구현합니다.
해당 기능은 격리 수준(Isolation level)에 따라 다르게 동작합니다.
READ_UNCOMMITTED 격리 수준의 경우는 InnoDB 버퍼 풀에 있는 변경된 데이터를 조회하여 제공하고, 이상의 격리 수준에서는 커밋 이전이라면 언두 영역의 데이터를 반환합니다.
이러한 과정을 DBMS에서는 MVCC라고 표현합니다. 즉, 하나의 레코드에 대해 2개의 버전(InnoDB 버퍼 풀, 언두 로그)을 유지하기 떄문입니다.
이 상태에서 COMMIT 명령을 수행하면 지금 상태를 영구적인 데이터로 만들고, ROLLBACK을 실행하면 언두 영역에 있는 백업 데이터를 InnoDB 버퍼 풀로 복구하고 언두 영역을 삭제합니다.(트랜잭션이 더는 없을 경우 비로소 삭제)

4. InnoDB 버퍼 풀

InnoDB Storage Engine에서 가장 핵심적인 부분으로, 디스크 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간입니다.
쓰기 작업을 지연시켜 일괄 작업 처리를 가능하게 하는 버퍼 역할도 수행합니다.
일반적인 애플리케이션에서는 DML명령어를 통해 여러 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시키지만, 버퍼 풀이 변경 데이터를 모아서 처리하면 디스크 작업 횟수를 줄일 수 있습니다.

5. InnoDB ACID

  • Atomicity
    • 트랜잭션의 원자성을 의미합니다. 하나의 트랜잭션에 묶여서 수행되는 연산은 모두 성공하거나 실패해야 합니다.
  • Consistency
    • 데이터베이스는 일관된 상태이어야 하며 일관된 상태에서 특정 작업이 수행된 이후에도 일관된 상태이어야 합니다.
    • 데이터베이스에 정의된 룰을 트랜잭션이 위반하게 된다면 rollback을 해주어 데이터베이스의 일관성을 깨지지 않게 유지합니다.
  • Isolation
    • 여러 트랜잭션이 동시에 실행되어도 각각의 트랜잭션이 독립되서 동작하는 것처럼 보이도록 하는 것입니다. 즉, 트랜잭션의 격리 수준과 관련된 특징입니다.
    • Isolation Level은 READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE이 있습니다.
  • Durability
    • Commit된 데이터는 데이터베이스에 영구적으로 저장되어야 합니다.
      데이터베이스 시스템이 문제가 발생하여 복구했을 때는 commit 된 데이터들은 모두 데이터베이스에 반영된 채로 남아있어야 합니다.

마무리

다양한 MySQL 기능이 InnoDB의 storage를 활용해서 구현하는 것이기 때문에 InnoDB에 대한 이해는 중요합니다.
포스팅된 정보들은 보통 DBMS의 Default 설정이 존재하기에 개발자 입장에서 알아서 해준다는 느낌을 받을 수 있습니다.
하지만, 상황에 따라 개발자가 해당 옵션들을 변경해야 하는 경우도 존재할 수 있을 것입니다.

profile
문제 해결과 개선 과제를 수행하며 성장을 추구하는 것을 좋아합니다.

0개의 댓글