MySQL MyISAM, InnoDB

985 단어·2 분·원문(.md)

차이를 알기전 일단 둘다 공통적으로 mysql의 스토리지 엔진이며

스토리지 엔진은 sql을 데이터가 실제로 저장,조회, 수정되는 방식으로 구현하는 내부 모듈이다.

같은 select insert update라도 데이터를 어떻게 디스크에 쓰고 어떻게 락을 걸고 어떻게 복구하는지는 전부 스토리지 엔진 책임이다.

MyISAM #

MyISAM은 mysql 초창기부터 사용된 엔진, 핵심 목표는 단순함과 빠른 읽기다.

데이터와 인덱스를 각각 .MYD, .MYI 파일로 분리해서 파일 시스템 위에 그대로 저장하며

db 엔진보다 고성능 파일 접근 계층에 가깝다.

이 구조 덕분에 구현은 단순하고 읽기 성능은 빠르지만, 데이터 보호를 위한 내부 메커니즘은 거의 없다.

락, 동시성 특징 #

MyISAM은 트랜잭션을 전혀 지원하지 않는다. COMMIT, ROLLBACK이 없고 여러 쿼리를 논리 작업으로 묶을 수 없다.

락은 테이블 단위의 락만 제공하며 한 세션이 쓰기를 시작하면 테이블 전체가 잠긴다.

이때문에 동시 쓰기 상황에 성능이 급격하게 붕괴되며 정합성은 전적으로 애플리케이션 책임이 되게 된다.

한계 #

서버가 비정상 종료되면 테이블 파일이 손상될 수 있으며, 수동 복구가 필요하다.

복구 과정에서도 데이터 유실이 발생할 가능성도 있다. 외래키를 지원하지 않아 참조 무결성도 보장되지 않는다.

결과적으로는 읽기 전용에 가까운 레거시 용도 외에는 현대 서비스에서 사용할 이유가 없다.

InnoDB #

InnoDB는 처음부터 트랜잭션 데이터 정합성을 목표로 설계된 엔진이다.

모든 데이터 변경은 트랜잭션 안에서 이루어지며, Buffer Pool을 중심으로 메모리를 직접 관리한다.

데이터는 clustered index 구조로 저장되며 기본 키 기준으로 정렬되며 이는 예측 가능한 접근 패턴과 안정적인 성능을 제공한다.

락 모델, MVCC #

InnoDB는 ACID 트랜잭션을 지원하고, MVCC를 통해 읽기 쓰기가 서로 덜 방해하도록 설계되어 있다.

락은 기본적으로 로우 단위의 락이며 충돌이 필요한 경우에만 잠금이 발생한다.

갭 락, 넥스트 키 락 같은 추가 락은 팬텀 리드(결과값이 한 트랜잭션 내 같은 조회에서 다르게 나오는 현상)을 방지 하기 위한 설계적 선택으로 정합성을 우선한다.

장애 복구 #

InnoDB는 redo log와 undo log를 사용해 crash safe를 보장한다.

서버가 갑자기 종료되어도 재시작 시 로그를 기반으로 일관된 상태로 자동 복구된다.

외래키를 지원해 참조 무결성을 db레벨에서 강제할 수 있으며, 동시성 쓰기 안정성까지 보함한 실제 서비스 성능에서 MyISAM을 압도한다. 사실상 표준

  • MyISAM: 단순·빠른 읽기, 트랜잭션·복구·동시성 포기한 레거시 엔진
  • InnoDB: 트랜잭션·정합성·복구를 책임지는 현대 OLTP 표준 엔진
DataBase/se.md