InnoDB는 MySQL의 기본 Storage Engine입니다.
개발자가 주로 사용하는 MySQL 데이터베이스의 대표 기능들(Transaction, lock ..)을 InnoDB에서 제공하기에 InnoDB에 대해 알아보려고 합니다.
InnoDB는 MySQL에서 기본으로 사용하고 있는 Storage Engine입니다.
아래 설명할 여러 장점들을 통해 데이터를 효율적으로 검색 및 관리하는 기능을 제공합니다.
InnoDB의 모든 테이블은 기본적으로 Primary Key를 기준으로 Clustering되어 저장됩니다.
즉, Primary Key 값의 순서대로 디스크에 저장됩니다. 결과적으로 쿼리의 실행 계획에서 Primary Key는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정됩니다.
InnoDB Storage Engine과 달리 MyISAM Storage Engine은 Clustering Key를 지원하지 않습니다.
그래서 MyISAM 테이블에서는 Primary Key와 Secondary Index는 구조적으로 차이가 없습니다.
외래 키데 대한 지원은 InnoDB Storage Engine 레벨에서 지원하는 기능이기에 MyISAM, MEMORY 테이블에서는 사용할 수 없습니다.
외래 키가 복잡하게 얽힌 경우에는 스키마 변경 관련 작업에 실패하는 경우가 종종 있는데, 이럴 경우 foreign_key_checks 시스템 변수를 OFF로 설정하면 외래 키 체크를 일시적으로 멈출 수 있습니다.
하지만 해당 옵션은 GLOBAL한 설정이기에 현재 세션에서만 사용할 수 있도록 해야되고, 제약사항에 위반할 수 있기에 주의해서 사용해야 한다.
일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능이며, MVCC의 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공하는 데 있습니다.
InnoDB는 언두 로그(Undo log)를 이용해서 해당 기능을 구현합니다.
해당 기능은 격리 수준(Isolation level)에 따라 다르게 동작합니다.
READ_UNCOMMITTED 격리 수준의 경우는 InnoDB 버퍼 풀에 있는 변경된 데이터를 조회하여 제공하고, 이상의 격리 수준에서는 커밋 이전이라면 언두 영역의 데이터를 반환합니다.
이러한 과정을 DBMS에서는 MVCC라고 표현합니다. 즉, 하나의 레코드에 대해 2개의 버전(InnoDB 버퍼 풀, 언두 로그)을 유지하기 떄문입니다.
이 상태에서 COMMIT 명령을 수행하면 지금 상태를 영구적인 데이터로 만들고, ROLLBACK을 실행하면 언두 영역에 있는 백업 데이터를 InnoDB 버퍼 풀로 복구하고 언두 영역을 삭제합니다.(트랜잭션이 더는 없을 경우 비로소 삭제)
InnoDB Storage Engine에서 가장 핵심적인 부분으로, 디스크 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간입니다.
쓰기 작업을 지연시켜 일괄 작업 처리를 가능하게 하는 버퍼 역할도 수행합니다.
일반적인 애플리케이션에서는 DML명령어를 통해 여러 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시키지만, 버퍼 풀이 변경 데이터를 모아서 처리하면 디스크 작업 횟수를 줄일 수 있습니다.
다양한 MySQL 기능이 InnoDB의 storage를 활용해서 구현하는 것이기 때문에 InnoDB에 대한 이해는 중요합니다.
포스팅된 정보들은 보통 DBMS의 Default 설정이 존재하기에 개발자 입장에서 알아서 해준다는 느낌을 받을 수 있습니다.
하지만, 상황에 따라 개발자가 해당 옵션들을 변경해야 하는 경우도 존재할 수 있을 것입니다.