개발 블로그

[Database] 스토리지 엔진 InnoDB VS MyISAM 본문

데이터/데이터베이스

[Database] 스토리지 엔진 InnoDB VS MyISAM

갹둥 2024. 7. 4. 23:38

스토리지 엔진

데이터베이스 엔진 또는 스토리지 엔진은 데이터베이스 관리 시스템이 데이터베이스에 대해 데이터를 삽입, 추출, 업데이트 및 삭제하는 데 사용하는 기본 소프트웨어 컴포넌트, 각 스토리지 엔진은 데이터의 저장, 검색, 업데이트 및 삭제와 관련된 특정 방식과 알고리즘을 구현

 

 

스토리지 엔진의 역할

  1. 데이터 저장: 데이터를 파일 시스템에 저장하거나 메모리에 유지
  2. 데이터 접근: 데이터를 읽고 쓰는 방법을 구현
  3. 인덱스 관리: 데이터를 빠르게 검색하기 위한 인덱스를 관리
  4. 트랜잭션 관리: 트랜잭션을 지원하는 경우, 데이터의 일관성과 무결성을 유지
  5. 동시성 제어: 다중 사용자 환경에서 데이터의 일관성을 보장

 

 

스토리지 엔진 지정 방법

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(50)
) ENGINE=InnoDB;

 

ENGINE={스토리지 엔진명} 으로 지정 가능

( MySQL 5.5 버전 이후로 InnoDB가 기본 스토리지 엔진으로 설정됨)

 

default-storage-engine = InnoDB

설정 파일(my.cnf 또는 my.ini)에서 default-storage-engine 변수를 설정해서 변경 가능(서버 재시작해야함)

 

 

SHOW ENGINES;

를 통해 엔진 확인 가능

 

 

 

 

 

참고로 SQL이 처리되는 과정은 아래와 같다

SQL이 처리되는 과정

1. SQL 구문 작성

사용자가 SQL 쿼리를 작성하여 DBMS에 제출

 

 

2. SQL 파싱 (Parsing)

SQL 파서는 SQL 구문을 분석하여 올바른지 확인하고, 구문 트리(Syntax Tree)를 생성

  • 구문 분석(Syntax Analysis): 쿼리의 문법이 SQL 표준에 맞는지 확인
  • 구조화(Semantic Analysis): 테이블과 컬럼이 존재하는지, 데이터 타입이 맞는지 등을 확인

 

3. SQL 최적화 (Optimization)

SQL 옵티마이저가 최적화 전략을 사용하여 쿼리 실행 계획(Query Execution Plan)을 생성

  • 옵티마이저(Optimizer): 다양한 접근 방법을 평가하고 최적의 방법을 선택
  • 통계 사용: 테이블의 통계 정보를 활용하여 최적화

 

4. SQL 실행 (Execution)

SQL 실행 엔진이 실행 계획에 따라 쿼리를 실행니다:

  • 스토리지 엔진 선택: InnoDB, MyISAM 등
  • 스토리지 엔진 인터페이스: SQL 실행 엔진이 스토리지 엔진 인터페이스를 통해 데이터 접근을 요청

 

5. 스토리지 엔진 작업 (Storage Engine Operations)

스토리지 엔진은 실제 데이터 저장 및 검색을 담당, Inno DB의 경우 다음과 같은 작업 수행

  • 버퍼 풀(Buffer Pool): 디스크 I/O를 최소화하기 위해 메모리에 자주 사용되는 데이터 페이지를 캐싱
  • 인덱스 사용: 인덱스가 있으면, 인덱스를 사용해 데이터를 빠르게 검색
  • 데이터 페이지 접근: 필요한 데이터 페이지를 버퍼 풀에서 찾고, 버퍼 풀에 없으면 디스크에서 읽어옴

 

6. 디스크 I/O (Disk I/O)

스토리지 엔진이 디스크에서 데이터를 읽거나 씀

  • 디스크 읽기(Read): 필요한 데이터 페이지를 디스크에서 읽어 버퍼 풀에 로드
  • 디스크 쓰기(Write): 데이터 변경 사항을 디스크에 기록, InnoDB의 경우, 변경 사항은 먼저 로그 파일에 기록되고 나중에 실제 데이터 파일에 반영

 

7. 결과 반환 (Result Return)

쿼리 결과가 사용자에게 반환, 클라이언트 애플리케이션으로 전송

 

 

 


 

✨InnoDB

InnoDB는 MySQL의 기본 스토리지 엔진으로, 높은 데이터 무결성과 트랜잭션 안전성을 제공함

주요 특징

  1. ACID 트랜잭션 지원: InnoDB는 트랜잭션을 지원하여 데이터 일관성과 무결성을 보장
  2. 외래 키(Foreign Key) 제약: InnoDB는 외래 키를 지원하여 참조 무결성을 보장
  3. 클러스터형 인덱스(Clustered Index): InnoDB는 각 테이블의 기본 키를 기준으로 데이터를 클러스터링하여 저장함, 이로 인해 기본 키 검색이 매우 빠름
  4. MVCC(Multi-Version Concurrency Control): InnoDB는 다중 버전 동시성 제어를 통해 읽기 작업과 쓰기 작업이 충돌하지 않도록 하여 높은 동시성 제공
  5. 자동 크래시 복구: InnoDB는 시스템 충돌 후 자동으로 데이터베이스를 복구할 수 있는 기능을 제공

장점

  • 트랜잭션 지원으로 데이터 무결성과 일관성 보장
  • 외래 키와 참조 무결성 지원
  • 높은 동시성 처리 능력
  • 충돌 후 자동 복구 기능

단점

  • 더 많은 메모리와 저장 공간 사용
  • 복잡한 시스템으로 인해 설정과 관리가 어려울 수 있음

 

✨MyISAM

MyISAM은 InnoDB보다 간단하고 빠른 읽기 성능을 제공하는 스토리지 엔진, 하지만 트랜잭션과 외래 키를 지원하지 않음

주요 특징

  1. 비트랜잭션성: MyISAM은 트랜잭션을 지원하지 않으며, 데이터 일관성을 보장하는 기능이 부족
  2. 테이블 락킹(Table Locking): MyISAM은 레코드 단위가 아닌 테이블 단위로 잠금을 수행
  3. 빠른 읽기 성능: MyISAM은 읽기 성능이 뛰어나며, 주로 읽기 작업이 많은 환경에서 사용
  4. 풀텍스트 인덱싱(Full-Text Indexing): MyISAM은 풀텍스트 검색을 지원하여 텍스트 데이터에서의 검색이 용이

장점

  • 읽기 성능이 뛰어남
  • 메모리와 저장 공간 사용이 적음
  • 간단한 구조로 인해 설정과 관리가 용이

단점

  • 트랜잭션과 외래 키를 지원하지 않음
  • 테이블 단위 잠금으로 인해 동시성 처리 능력이 낮음
  • 데이터 손상 시 자동 복구 기능 부족

 

 


✨InnoDB vs MyISAM  비교

트랜잭션 지원 예 (ACID 준수) 아니오
외래 키 아니오
잠금 방식 레코드 단위 잠금 테이블 단위 잠금
동시성 높은 동시성 (MVCC) 낮은 동시성
읽기 성능 좋음 매우 좋음
쓰기 성능 좋음 좋음
복구 기능 자동 복구 기능 제공 자동 복구 기능 없음
메모리 사용 더 많이 사용 적게 사용