Spring

MariaDB 엔진 - InnoDB vs MyISAM

jhyngu 2025. 1. 10. 21:05

 

SHOW ENGINES;

Engine Support Comment Transactions XA Savepoints

Engine Support Comment Transactions XA Savepoints
InnoDB DEFAULT Supports transactions YES YES YES
MyISAM YES Non-transactional engine NO NO NO
MEMORY YES Stored in memory NO NO NO
CSV YES CSV storage engine NO NO NO
  • Engine: 스토리지 엔진의 이름.
  • Support: 엔진이 활성화되어 있는지 여부 (YES, NO, DEFAULT).
  • Comment: 간단한 설명.
  • Transactions: 트랜잭션 지원 여부.
  • XA: 분산 트랜잭션 지원 여부.
  • Savepoints: 트랜잭션 내의 저장 지점 지원 여부.

InnoDB와 MyISAM 비교

특징 InnoDB MyISAM
트랜잭션 지원 지원함 (ACID 준수) 지원하지 않음
외래 키 지원함 지원하지 않음
잠금 방식 행 수준 잠금 (Row-level locking) 테이블 수준 잠금 (Table-level locking)
데이터 복구 (Crash Recovery) 자동 복구 기능 제공 자동 복구 기능 없음
성능 다중 사용자 환경에서 뛰어난 동시성 제공 읽기 작업(SELECT)에서 더 빠른 성능
디스크 공간 사용량 복잡한 구조로 인해 더 많은 디스크 공간 사용 단순한 구조로 인해 디스크 공간을 효율적으로 사용
전체 텍스트 검색 지원하지 않음 지원함 (Full-Text Search Index 사용 가능)
데이터 저장 방식 데이터를 클러스터된 인덱스에 저장 (Clustered Index) 데이터를 독립적으로 저장
락 경합 여러 트랜잭션에서 적은 경합 발생 다중 쓰기 작업 시 경합 발생
ACID 특성 지원 (Atomicity, Consistency, Isolation, Durability) 지원하지 않음

주요 차이점 설명

1. 트랜잭션 지원

  • InnoDB는 트랜잭션을 지원하며, COMMIT, ROLLBACK 등을 통해 작업을 원자적으로 관리할 수 있습니다.
  • MyISAM은 트랜잭션을 지원하지 않아, 데이터 변경이 즉시 저장되며 작업의 원자성을 보장하지 않습니다.

2. 잠금 수준

  • InnoDB는 행 수준 잠금을 제공하여, 동시성을 높이고 다중 사용자 환경에서 성능을 향상시킵니다.
  • MyISAM은 테이블 수준 잠금을 사용하여, 동시 업데이트 시 성능 저하가 발생할 수 있습니다.

3. 외래 키(Foreign Key)

  • InnoDB는 외래 키 제약 조건을 지원하여 데이터 무결성을 보장합니다.
  • MyISAM은 외래 키를 지원하지 않아, 관계형 무결성은 애플리케이션 레벨에서 처리해야 합니다.

4. 데이터 복구

  • InnoDB는 로그 파일을 기반으로 충돌 이후 데이터 복구를 지원합니다.
  • MyISAM은 데이터 손실 발생 시 수동으로 복구해야 하며, 복구 시간이 길어질 수 있습니다.

5. 성능

  • InnoDB는 다중 쓰기 및 읽기 환경에서 성능이 우수하며, 대규모 트랜잭션 처리에 적합합니다.
  • MyISAM은 단일 쓰기 및 읽기 작업에서 더 높은 성능을 발휘합니다. 특히 읽기 중심의 시스템에서 효율적입니다.

6. 전체 텍스트 검색

  • MyISAM은 기본적으로 Full-Text Search를 지원하여 텍스트 기반 데이터 검색에 유리합니다.
  • InnoDB는 MySQL 5.6 이후부터 Full-Text Search를 제한적으로 지원합니다.

사용 시 고려 사항

InnoDB 사용에 적합한 경우

  • 데이터 무결성이 중요한 애플리케이션 (e.g., 금융 시스템).
  • 다중 사용자가 데이터를 동시에 읽고 쓰는 환경.
  • 트랜잭션이 필요한 애플리케이션.

MyISAM 사용에 적합한 경우

  • 읽기 작업이 대부분인 데이터베이스 (e.g., 로그 분석).
  • 외래 키나 트랜잭션이 필요 없는 간단한 데이터 구조.
  • 데이터 복구가 중요한 고려사항이 아닌 경우.

실습을 통해 차이 이해하기

(1) 테이블 생성 시 엔진 선택

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

CREATE TABLE test_myisam (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
) ENGINE=MyISAM;

(2) 기본 스토리지 엔진 확인

SHOW VARIABLES LIKE 'default_storage_engine';

(3) 현재 테이블의 엔진 확인

SELECT TABLE_NAME, ENGINE
FROM information_schema.tables
WHERE table_schema = 'sample';