스토리지 엔진(storage engine)은 데이터베이스 엔진(database engine)이라고도 불리고, 데이터베이스 관리 시스템(DBMS)이 데이터베이스에 대해 데이터를 INSERT, SELECT, UPDATE, DELETE(CRUD 참조) 하는데 사용하는 기본 소프트웨어 컴포넌트입니다.
데이터베이스는 스토리지 엔진을 이용해 쿼리 언어, 인덱싱, 트랜잭션 등의 유용한 기능을 제공합니다.
📌 트랜잭션을 처리하기 위해 고안됐는데 대부분의 경우 롤백되지 않고 완료되는 짧은 트랜잭션이 많은 경우를 처리하기 좋게 되어 있습니다.
📌 InnoDB는 가장 많이 사용되는 Storage Engine 으로, ACID 트랜잭션을 지원하는 대표적인 MYSQL 의 대표적이고 뛰어난 성능과 장애 복구 기능을 가진 엔진입니다. 결제 정보와 같이 정보의 무결성을 가져야하고 손실되면 안되는 중요한 데이터를 필요로 할 때 사용합니다.
ACID는 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability) 의 약자이며, 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다.
📌 InnoDB 테이블은 클러스터 인덱스(clustered index) 위에 구성되어 있으며, InnoDB의 인덱스 구조는 대부분의 MYSQL 스토리지 엔진의 인덱스 구조와는 매우 다릅니다. 그 결과 매우 신속한 기본 키(primary key) 조회가 가능합니다.
📌 MVCC(Mutli Version Concurrency Control) 기술을 이용해 락을 걸지 않고 읽기 작업을 수행하여 락을 걸지 않기때문에 InnoDB에서 읽기 작업은 다른 트랜잭션이 가지고 있는 락을 기다리지 않아도 됩니다.
📌 손실이나 장애로부터 데이터를 보호하기 위해 MYSQL 서버가 완료되지 못한 트랜잭션이나 디스크에 일부만 기록된 트랜잭션 등에 대해서 자동으로 복구 작업이 이루어집니다.
정리 : 트랜잭션, 락없는 읽기 기능, 데이터 자동 복구 기능, 기본키에 관련한 빠른 조회기능
📌 MYSQL 의 기본 스토리지 엔진이지만, 트랜잭션을 지원하지 않기 때문에 InnoDB보다 심플하고 기본적으로 빠르지만 동시성 제어가 어렵다는 단점이 있습니다. 각 테이블을 데이터 파일과 인덱스 파일 총 두곳으로 나누어 저장합니다.
📌 InnoDB 의 버퍼풀과 비슷한 역할을 하는 것이 MyISAM 의 Key Cache 입니다. 하지만 이름 그대로 Key Cache는 인덱스만 대상으로 작동하며 또한 인덱스의 디스크 쓰기 작업에 대해서만 부분적으로 버퍼링 역할만 합니다.
📌 행 단위가 아니라 테이블 전체를 잠구고, reader 는 읽어야 할 모든 테이블에 읽기 권한을, writer는 배타적 쓰기 잠금 권한을 얻습니다. select 쿼리 실행 중에도 테이블에 새 행을 삽입할 수 있는데(동시 삽입), 이 기능은 유용하게 쓰입니다.
📌 CHECK T ABLE tableName 과 REPAIR TABLE tableName 명령을 이용하면 테이블 오류를 조사하고 복구할 수 있습니다. 즉, InnoDB와 달리 자동이 아닌 수동으로 복구합니다.
📌 테이블을 생성할 때 DELAY_KEY_WRITE 옵션을 ON으로 설정하면 쿼리 실행으로 변경된 인덱스 데이터를 바로 디스크에 저장하지 않고 메모리에 버퍼링 해두었다가 버퍼를 정리하거나, 테이블을 닫을때 FLUSH 를 하여 테이블의 성능을 높여줍니다.
정리 : 테이블 전체 잠금, 동시 삽입 기능, 트랜잭션 X, 수동 복구, key 버퍼링 기능
📌 메모리에 데이터를 저장하는 엔진이며 트랜잭션을 지원하지 않고 table-level locking을 사용합니다.
📌 메모리를 사용하기 때문에 기본적으로 속도가 아주 빠른 편이지만 데이터를 잃어 버릴 위험이 있습니다. 따라서 중요하지 않지만 빠른 처리가 필요할 때 사용하는 엔진입니다.
📌 메모리에 저장하기 때문에 컴퓨터를 재시작할 경우 데이터가 날라가지만, 테이블의 구조는 날라가지 않습니다.
정리 : 트랜잭션 지원X, 기본적인 속도 빠름, 재시작 시 데이터는 날라가나 테이블 구조는 유지
📌 아카이브 엔진은 아주 빠르게 insert 쿼리를 처리할 수 있는 엔진입니다. 데이터 쓰기를 버퍼링하고 각 행이 삽입 될때 마다 zlib으로 압축합니다.
📌 index를 지원하지 않으며, 데이터를 삽입하거나 검색은 할 수 있으나, 데이터를 삭제하거나 수정할 수 없습니다.
📌 트랜잭션을 지원하지 않으며 row-level locking 을 사용하며, 주로 많은 양의 로그성 데이터를 저장하고 읽는데 사용된다.
정리 : insert에 특화된 엔진, 주로 로그에 이용, 트랜잭션X, 읽기, 검색만 가능
MYSQL 기반으로 테이블을 설계할 때 테이블마다 엔진을 다르게 설정할 수 있으며, 초기에 잘못 설정하면 나중에 번거로워질 수 있습니다.
회사에서든 개인 프로젝트에서든 보통은 트랜잭션이 필요하기 때문에 InnoDB를 사용하고, 로그 같은 곳에서 Archive 나 MyISAM 을 사용해볼만 하다.
https://nomadlee.com/mysql-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%97%94%EC%A7%84-%EC%A2%85%EB%A5%98-%EB%B0%8F-%ED%8A%B9%EC%A7%95/
https://medium.com/yugabyte/a-busy-developers-guide-to-database-storage-engines-the-basics-
https://velog.io/@jinh2352/Storage-Engine
https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%97%94%EC%A7%84