Amazone RDS에서 MySQL instance를 생성할 때 아래와 같은 문구가 있다.
InnoDB와 MyISAM간 어떤 차이가 있길래 InnoDB 엔진에서만 자동 백업을 지원할까? 궁금해서 찾아봤다.
InnoDB는 사용자의 데이터를 보호하고 내결함성을 제공하는 commit, rollback 및 충돌 복구 기능과 같은 기능을 갖춘 MySQL용 transaction-safe (ACID 호환)스토리지 엔진이다.
row-level locking
을 사용하며 non-locking
읽기 방식으로 다중 사용자의 동시성과 성능을 향상시킨다.
InnoDB는 일반 쿼리에 대한 I/O를 줄이기 위해 Primary key
를 기반으로 클러스터형 인덱스에 사용자 데이터를 저장한다. 또한 데이터 무결성을 유지하기 위해 Foreign key
참조 무결성 제약 조건도 지원한다.
MyISAM은 My Indexed Sequential Access Method의 약어로 웹, 데이터 웨어하우징 및 기타 분석 환경에서 자주 사용된다.
MyISAM 스토리지 엔진은 모든 MySQL 구성을 지원한다.
2009년 12월까지 기본 스토리지 엔진이었으며, 이후 InnoDB로 기본 엔진이 변경되었다.
ISAM 알고리즘을 기반으로 하며 대용량 데이터에 빠르게 응답한다.
MyISAM은 최소한의 데이터에 대한 이력을 가지므로 데이터 웨어하우징 및 웹 애플리케이션에 더 적합하다.
이제 MyISAM과 InnoDB에 대해 기본적인 이해를 가졌으니 두 엔진의 차이점을 알아보자.
MyISAM은 non-transactional
스토리지 타입이며 롤백이 필요한 경우 수동으로 처리해야 한다.
InnoDB는 transaction
스토리지 타입으로 쓰기가 처리되지 않을 경우 자동으로 롤백된다.
MySQL의 locking은 두 사용자가 하나의 행을 동시에 수정하는 것을 방지하기 위해 테이블을 잠구는 메커니즘으로 race condition을 방지하기 위해 사용된다.
MyISAM은 기본적인 table locking method
를 사용하고 단일 세션에서 테이블을 수정할 수 있도록 한다. 즉 하나의 사용자만 테이블을 바꿀 수 있다. 만약 다른 사용자가 테이블을 바꾸려 시도한다면, 테이블이 잠겼다는 응답을 받게 된다. table locking method
는 많은 메모리를 요구하지 않기 때문에 읽기 전용 데이터베이스에 유용하다.
InnoDB는 테이블의 row-level locking method
를 사용한다. 이 메서드는 수정 프로세스에서 테이블의 행만 잠그는 방식으로 동일한 행에 다중 세션 접근을 지원한다. row-level locking
은 다중 사용자가 접근하는 데이터베이스에 유용하다. 다만 많은 메모리를 필요로 하며, 조회와 데이터 수정에 대해 시간이 걸린다는 단점이 있다.
외래 키는 테이블 데이터를 다른 테이블에 연결하는 열로, 두 데이블 간 연결된 내용과 다른 레코드를 추가하는 것을 방지한다.
MyISAM은 외래 키를 지원하지 않는다. 하지만 InnoDB는 외래 키를 지원한다.
ACID는 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)의 약자로 데이터베이스 transaction이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리킨다.
MyISAM은 ACID 성질을 지원하지 않지만 InnoDB는 지원한다.
InnoDB는 rollbacks, commit 등 transaction 속성을 지원하고 쓰기 속도가 빠르다. InnoDB은 대용량 데이터에서 MyISAM보다 좋은 성능을 갖는다.
MyISAM은 trasaction 속성을 지원하지 않고 읽기 속도가 빠르다. InnoDB와 비교해 보면 대용량 데이터에서 성능이 떨어진다.
InnoDB는 transaction log를 사용해 모든 작업을 기록하므로 신뢰할 수 있다. 따라서 장애 발생 시 로그를 사용해 빠르게 복구할 수 있다.
MyISAM은 데이터 무결성을 제공하지 않는다. 하드웨어 오류 및 취소된 작업으로 인해 데이터가 손상될 수 있다.
InnoDB는 큰 버퍼 풀을 지원해 데이터와 인덱스를 캐싱할 수 있다. 하지만 full-text search
에는 지원하지 않는다.
MyISAM의 버퍼는 인덱싱 전용이다. 또한 full-text search
를 지원한다.
InnoDB는 장애 발생 시 로그를 통해 복구를 할 수 있지만, MyISAM은 안정적인 장애 복구를 지원하지 않으며, 테이블이 손상될 수 있기 때문에 RDS(MySQL)에서 InnoDB만 자동 백업을 지원한다는 것을 알 수 있다.