[Database] MySQL Storage Engine

Song-YunMin·2021년 3월 17일
1

DATABASE

목록 보기
5/8

MySQL 스토리지 엔진

MySQL 은 각 각 데이터베이스(스키마라고도 불리는)를 파일 시스템 안의 데이터 디렉터리의 하위 디렉터리로 저장합니다. 테이블을 생성하면 MySQL은 테이블 이름과 같은 이름을 가진 .frm을 만들고 그 안에 테이블 정의 정보를 저장합니다.

즉, MyTable이라는 테이블을 만들 경우 MySQL은 MyTable.frm에 테이블 정의를 저장합니다. MySQL은 데이터베이스 이름과 테이블 정의를 저장하는데 파일시스템을 사용하므로 대/소문자 구분은 플랫폼에 따라 결정이 됩니다.

윈도우 MySQL 인스턴스는 테이블과 데이터베이스 이름에는 대/소문자 구분이 없으나 UNIX 계열 시스템에서는 대/소문자를 구분합니다.

Storage Engine에 따라 테이블 데이터와 인덱스를 저장하는 방식이 다르지만 테이블 정의는 서버에서 담당합니다.

특정 테이블이 어떤 스토리지 엔진을 사용하는지 확인하려면 SHOW TABLE STATUS 명령을 이용하면 됩니다.

MySQL 스토리지 엔진 종류

MySQL 스토리지 엔진 중에 보편적이고 알려진 엔진은 아래와 같습니다.

  • InnoDB 엔진
  • MyISAM 엔진
  • Memory 엔진
  • Archive 엔진
  • CSV 엔진
  • Federated 엔진

InnoDB엔진

InnoDB 엔진은 트랜잭션을 처리하기 우해 고안되었는데, 대부분의 경우 롤백되지 않고 완료되는 (정상 종료되는) 짧은 트랜잭션이 많은 경우를 처리하기 좋게 되어있습니다.

InnoDB 는 가장 많이 사용되는 Storage Engine으로 ACID 트랜잭션을 지원하는 대표적인 MySQL의 대표적이고 뛰어난 성능과 장애 복구 기능을 가진 엔진입니다. 결제 정보와 같이 정보의 무결성을 가져야하고 손실되면 안되는 중요한 데이터를 필요로 할 때 사용합니다.

MyISAM 엔진

MyISAM은 전문 인덱싱, 압축, 공간 함수 등 여러 유용한 기능을 제공하지만, Table Lock 을 이용하여 트랜잭셕이나 Row 수준의 잠금을 지원하지 않습니다. MyISAM은 Transaction을 지원하지 않기 때문에 InnoDBㅂ다 심플하고 기본적으로 빠르지만 동시성 제어가 어렵다는 단점이 있습니다. 그래서 Read 쿼리가 많은 환경에서 많이 사용됩니다.

Memory 엔진

메모리에 데이터를 저장하는 엔진이며 Transaction을 지원하지 않고 table-Level Locking을 사용합니다.

메모리를 사용하기 때문에 기본적으로 속도가 아주 빠른 편이지만 데이터를 읽어버릴 위험이 있습니다. 그렇기 때문에 중요하지 않지만 빠른 처리가 필요한 임시 테이블로 많이 사용하는 편입니다. 메모리 테이블의 모든 데이터는 메모리 안에 저장되므로 쿼리가 디스크 입출력을 기다릴 필요가 없습니다.

HEAP 테이블이라 불리던 메모리 테이블은 불변하는 데이터나 재시작 이후 지속되지 않는 데이터에 빠르게 접근하는데 유용합니다. 메모리 테이블의 테이블 구조는 서버가 재시작해도 지속되지만 데이터는 지속되지 않습니다.

Archive 엔진

아카이브 엔진은 아주 빠르기 INSERT 쿼리를 처리할 수 있는 엔진입니다. MyISAM 보다 디스크 입출력을 훨 씬 적게 일으키는데, 데이터 쓰기를 버퍼링하고 각 행이 삽입될 때마다 zlib 로 압축하기 때문입니다.

Index를 지원하지 않으며 INSERT/REPLACE/SELECT 쿼리와 같이 데이터를 삽입하거나 읽는 것은 가능하지만, DELETE/UPDATE 와 같이 데이터를 삭제하거나 수정할 수는 없습니다. Transection을 지원하지 않고 row-Loval Locking 을 사용하며 주로 많은 양의 로그성 데이터를 저장하고 읽는데 주로 사용됩니다.

CSV 엔진

CSV엔진은 쉼표로 구분된 값으로 구성된 파일을 테이블로 처리할 수 있지만 인덱스를 지원하지는 않습니다. CSV엔진은 서버가 실행되는 동안에 데이터베이스 내외로 파일을 복사하게 해줍니다. 스프레드 시트에서 CSV파일을 내보내 MySQL 서버에 데이터 디렉터리에 저장하면 서버는 그 즉시 이 파일을 읽을 수 있습니다. 마찬가지로 CSV 테이블에 데이터를 기록하면 외부 프로그램이 이를 바로 읽을 수 있습니다.

Federated 엔진

Federated 엔진은 데이터를 자체 스토리지에 저장하지 않는다. 각 Federated 테이블은 원격 MySQL 서버 내의 테이블을 참조하는데, 결국 모든 작업에 있어서 원격 서버에 연결한다고 볼 수 있습니다.

현재 Federated 엔진을 구현하는 방법에는 여러 문제점과 제한점이 있습니다.

Federated 엔진은 특유의 작동 방식 때문에 기본키를 이용한 단일 행 조회나 원격 서버에 실행될 INSERT 쿼리에 가장 유용하지만 집계 쿼리나 조인 또는 다른 기본적인 작업에는 성능이 떨어집니다.

Blackhole 엔진

Blackhole 엔진은 저장 메커니즘을 전혀 갖고 있지 않으며 모든 INSERT 구문을 실행하지 않고 그냥 버립니다. 그러나 서버는 Blackhole 테이블에 대한 쿼리를 로그에 기록하므로 그 정보가 슬레이브에 복제되거나 로그에 남아 있을 수 있습니다. 이로인해 Blackhole 엔진은 복잡한 복제 구성과 감사용 로깅에 유용하게 사용할 수 있습니다.

MySQL 엔진 선택 시 고려사항

MySQL 기반의 응용 프로그램을 설계할 때, 어떤 스토리지 엔진을 사용해 데이터를 저장할 지 결정해야 합니다. 설계 단계에서 이를 생각하지 않으면 나중에 번거로워 질 수 있습니다.

테이블별로 스토리지 엔진을 선택할 수 있으므로, 각 테이블이 어떻게 사용되고 데이터가 어떻게 저장되는지 확실히 이해해야 하며, 응용프로그램을 전체적으로 이해하고 확장 가능성을 아는 것도 유용합니다.

응용프로그램에 트랜잭션이 필요하다면 InnoDB 엔진이 가장 안정적이라고 할 수 있습니다. MyISAM은 트랜잭션이 필요없는 사이트에 사용되며, DML 중 SELECT 가 메인인 업무에 적합하다고 보면 됩니다. 어떻게 보면 데이터 실무에서 트랜잭션을 지원하지 않는 것은 말이 되지 않는 상황이지만, 로깅과 같은 환경에서는 유리하다고 볼 수 있습니다.

Reference

MySQL 스토리지 엔진 종류 및 특징


profile
고독한 서버 개발 3년차

0개의 댓글