한 줄 정의

MyISAM은 키 캐시로 인덱스만 캐싱하고, 데이터 캐싱은 OS에 의존하며, 클러스터링 없이 INSERT 순서대로 저장하는 단순한 스토리지 엔진입니다.

쉽게 말하면

InnoDB가 자체 창고(버퍼 풀)에서 재료(데이터)와 목록(인덱스)을 모두 관리하는 전문 창고 라면, MyISAM은 목록(인덱스)만 자체 관리하고 재료(데이터)는 건물 관리인(OS 캐시)에게 맡기는 간이 창고 입니다.

왜 중요한가?

MySQL 8.0에서 MyISAM은 사실상 퇴출 수순 입니다. 시스템 테이블까지 InnoDB로 전환됐고, 전문 검색/공간 인덱스도 InnoDB가 지원합니다.

그럼에도 알아야 하는 이유는 InnoDB와의 구조적 차이를 이해 하면, InnoDB의 클러스터링 인덱스와 버퍼 풀이 왜 중요한지 더 깊이 와닿기 때문입니다.

핵심 내용

키 캐시

MyISAM에서 InnoDB 버퍼 풀에 대응하는 것이 키 캐시(Key Cache) 입니다. 하지만 큰 차이가 있습니다:

기준InnoDB 버퍼 풀MyISAM 키 캐시
캐시 대상데이터 + 인덱스인덱스만
데이터 캐시자체 관리OS 캐시에 의존
쓰기 버퍼링완전 지원인덱스 쓰기만 부분 지원

키 캐시의 효율성은 히트율로 측정합니다:

히트율 = 100 - (Key_reads / Key_read_requests * 100)
SHOW GLOBAL STATUS LIKE 'Key%';

99% 이상 의 히트율을 유지하도록 key_buffer_size를 설정해야 합니다.

명명된 키 캐시

기본 키 캐시 외에 별도의 키 캐시를 만들어 특정 테이블의 인덱스를 할당할 수 있습니다:

key_buffer_size = 4GB
kbuf_board.key_buffer_size = 2GB
kbuf_comment.key_buffer_size = 2GB
CACHE INDEX db1.board, db2.board IN kbuf_board;
CACHE INDEX db1.comment, db2.comment IN kbuf_comment;

명명된 키 캐시에 테이블을 명시적으로 할당하지 않으면 메모리만 점유하고 사용되지 않으므로 주의가 필요합니다.

운영체제 캐시 의존

MyISAM은 데이터 파일에 대한 자체 캐시가 없습니다. 데이터 읽기/쓰기는 OS의 파일 시스템 캐시에 전적으로 의존합니다.

따라서 MyISAM 중심 환경에서는:

  • 키 캐시는 물리 메모리의 40% 이하 로 설정
  • 나머지는 OS가 파일 캐시로 사용 할 수 있도록 여유를 남겨야 합니다
  • MySQL이나 다른 애플리케이션이 메모리를 모두 사용하면 MyISAM 테이블 쿼리가 급격히 느려집니다

데이터 파일과 PK 구조

InnoDB와 가장 큰 구조적 차이점입니다.

flowchart LR
    subgraph InnoDB["InnoDB (클러스터링)"]
        PK_I["PK 인덱스"]
        SEC_I["세컨더리 인덱스"]
        DATA_I["데이터 (PK 순서로 정렬)"]
        PK_I -->|직접 접근| DATA_I
        SEC_I -->|PK 값으로| PK_I
    end

    subgraph MyISAM["MyISAM (비클러스터링)"]
        PK_M["PK 인덱스"]
        SEC_M["세컨더리 인덱스"]
        DATA_M["데이터 (INSERT 순서)"]
        PK_M -->|ROWID| DATA_M
        SEC_M -->|ROWID| DATA_M
    end
기준InnoDBMyISAM
데이터 정렬PK 순서로 물리적 정렬INSERT 순서 (Heap)
세컨더리 인덱스 포인터PK 값 (논리적 주소)ROWID (물리적 주소)
PK 레인지 스캔매우 빠름 (연속된 디스크 읽기)PK와 무관한 랜덤 읽기
ROWID

MyISAM 테이블의 모든 레코드는 ROWID 라는 물리적 주소를 가집니다:

  • 고정 길이 ROWID: MAX_ROWS 옵션 지정 시, 4바이트 정수 (INSERT 순번)
  • 가변 길이 ROWID: 기본 모드. 2~7바이트 (데이터 파일 내 offset). myisam_data_pointer_size 기본값 7로 최대 256TB

InnoDB와 MyISAM, MEMORY 엔진 비교

MySQL 8.0에서 MyISAM/MEMORY를 선택할 이유는 없습니다:

  • MyISAM: 시스템 테이블까지 InnoDB로 전환됨. 전문 검색, 공간 인덱스도 InnoDB 지원. 향후 제거 예상
  • MEMORY: “메모리”라는 이름에 비해 테이블 수준 잠금 으로 동시 처리 성능이 떨어짐. 가변 길이 타입 미지원. MySQL 8.0에서 내부 임시 테이블도 TempTable 엔진 으로 대체됨

내 생각

  • MyISAM을 새로 사용할 일은 없지만, 레거시 시스템에서 마이그레이션할 때 InnoDB와의 구조적 차이를 이해해야 합니다. 특히 세컨더리 인덱스가 PK 값을 참조하는 InnoDB의 특성상, PK 크기가 커지면 모든 세컨더리 인덱스도 커진다 는 것을 MyISAM에서는 경험할 수 없습니다.

  • MEMORY 엔진이 “메모리에서 동작하니 빠르다”는 것은 단일 스레드 환경에서만 성립합니다. 실무의 동시 접속 환경에서는 테이블 잠금 때문에 InnoDB보다 느립니다.

관련 개념

출처

  • Real MySQL 8.0 (1권), 4.3 MyISAM 스토리지 엔진 아키텍처