[Real MySQL] 4.3. MyISM 스토리지 엔진

@lim · August 30, 2024

MyISAM 특징

MyISAM 테이블의 인덱스는 키 캐시를 이용하여 빠르게 검색이 가능하다.

데이터에 대해서는 자체적인 캐시나 버퍼링 기능이 없다.

따라서 데이터의 읽기/쓰기는 항상 운영체제의 디스크 I/O로 처리된다.

Key cache (키 버퍼)

InnoDB의 버퍼 풀과 비슷한 역할을 수행한다.

인덱스만들 대상으로 작동된다.

캐시 히트율 계산

키 캐스 히트율(Hit rate) : 100 - (Key_reads / Key_read_requests * 100)

  • Key_read : 인덱스를 디스크에서 읽어 들인 횟수
  • Key_read_requests : 키 캐시로부터 인덱스를 읽은 횟수

상태 값을 알아보는 명령어

SHOW GLOBAL STATUS LIKE 'Key%';

운영체제의 캐시 및 버퍼

  • 운영체제는 파일에 대한 캐시와 버퍼링 메커니즘이 있어 이를 통해 디스크 접근을 줄일 수 있음

  • 운영체제 캐시는 InnoDB 만큼 전문적이지는 않으나 성능에는 도움

  • 운영체제 캐시는 남는 메모리를 사용

  • MyISAM 테이블을 주로 사용한다면 운영체제를 위한 충분한 여유 공간 확보 필요

  • 책에서는 MyISAM을 주로 사용하는 경우 키 캐시를 물리 메모리의 40% 이하로 설정하도록 권장

데이터 파일과 PK(index) 구조

  • 데이터 저장 방식

    • InnoDB : PK에 의해 클러스터링 되어 저장
    • MyISAM : PK와 무관하게 INSERT 순서대로 저장 (Heap 공간처럼 활용)
  • ROWID

    • MyISAM 테이블의 각 레코드가 가지는 물리적 주소값
    • PK와 세컨터리 인덱스 모드 ROWID를 포인터로 사용
  • ROWID 저장 방식

    • 고정 길이 ROWID
      • MAX_ROWS 옵션을 사용할 경우
      • 4바이트 정수 사용
      • INSERT된 순번이 ROWID로 사용
    • 가변 길이 ROWID
      • MAX_ROWS 옵션을 사용하지 않을 경우
      • myisam_data_pointer_size 시스템 변수에 따라 2-7바이트 사용
      • 첫 번째 바이트는 ROWID 길이 저장, 나머지는 실제 ROWID 저장
      • 데이터 파일에서 레코드의 위치(Offset)가 ROWID로 사용
  • 테이블 크기 제한

    • 가변 길이 ROWID 사용 시 기본적으로 최대 256TB (2^48)
    • myisam_data_pointer_size를 8로 설정 시 최대 64PB (2^56)까지 확장 가능
  • 인덱스 구조

    • 프라이머리 키와 세컨더리 인덱스 모두 ROWID를 통해 실제 데이터에 접근
    • InnoDB와 달리 프라이머리 키가 데이터 정렬이나 저장에 영향을 주지 않음
  • 성능 특성

    • 순차적 INSERT가 빠름 (데이터가 순서대로 저장되므로)
    • 하지만 프라이머리 키 기반 검색 시 InnoDB에 비해 추가적인 디스크 I/O 발생 가능

참고 내용

  • Real MySQL 8.0 1권 (백은빈, 이성욱)
@lim
기억은 기록기록