MyISAM 스토리지 엔진 아키텍처

공부하는 감자·2024년 2월 26일
0

MySQL

목록 보기
3/74
post-thumbnail

MyISAM 스토리지 엔진 아키텍처

MyISAM 스토리지 엔진의 성능에 영향을 미치는 요소인 키 캐시와 운영체제의 캐시/버퍼에 대해 살펴본다.

Key cacge (키 캐시, 키 버퍼)

  • InnoDB의 버퍼 풀과 비슷한 역할을 한다.
  • MyISAM 키 캐시는 인덱스만을 대상으로 작동하며, 인덱스의 디스크 쓰기 작업에 대해서만 부분적으로 버퍼링 역할을 한다.
  • 키 캐시 히트율: 키 캐시가 얼마나 효율적으로 작동하는지 확인할 수 있는 수식
    • key_reads: 인덱스를 디스크에서 읽어 들인 횟수를 저장하는 상태 변수
    • key_read_request: 키 캐시로부터 인덱스를 읽은 횟수를 저장하는 상태 변수
키 캐시 히트율(Hit rate)=100(key_reads / key_read_requests  100)키\ 캐시\ 히트율(Hit\ rate)=\\ 100 - (key\_reads\ /\ key\_read\_requests\ *\ 100)
-- 상태 변수 알아보기
SHOW GLOBAL STATUS LIKE 'key%';
  • 매뉴얼에서는 일반적으로 히트율은 99% 이상으로 유지하라고 권장한다.
    • 99% 미만이라면 키 캐시를 조금 더 크게 설정하는 것이 좋다.
    • 32비트 운영체제: 하나의 키 캐시에 4GB 이상의 메모리 공간을 설정할 수 없다.
    • 64비트 운영체제: OS_PER_PROCESS_LIMIT 값만큼 메모리를 할당할 수 있다.
  • 제한 값 이상의 키 캐시를 할당하고 싶다면 기본(Default) 키 캐시 이외의 별도의 명명된 키 캐시 공간을 설정해야 한다.
    • 기본(Default) 키 캐시 공간을 설정하는 파라미터는 key_buffer_size 다.
    • 명명된 추가 키 캐시는 어떤 인덱스를 캐시할지 MySQL(MyISAM 스토리지 엔진)에 알려줘야 한다.
-- 기본 키 캐시와 별도의 키 캐시 명명
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 스토리지 엔진은 MyISAM 테이블의 데이터에 대해, 디스크로부터 I/O를 해결해 줄 만한 캐시나 버퍼링 기능이 없다.
  • 따라서 MyISAM 테이블의 데이터 읽기/쓰기 작업은 항상 운영체제의 디스크 읽기/쓰기 작업으로 요청된다.
    • 대부분의 운영체제는 디스크로부터 읽고 쓰는 파일에 대한 캐시나 버퍼링 매커니즘을 탑재하고 있다.
  • 운영체제의 캐시 기능은 InnoDB처럼 데이터의 특성을 알고 전문적으로 캐시나 버퍼링을 하지는 못한다.
    • 운영체제의 캐시 공간은 남는 메모리를 사용하는 것이 기본 원칙
    • MyISAM 테이블을 주로 사용한다면 운영체제가 사용할 수 있는 캐시 공간을 위해 충분한 메모리를 비워둬야 한다.
  • 일반적으로 키 캐시는 최대 물리 메모리의 40% 이상을 넘지 않게 설정하고, 나머지 메모리 공간은 운영체제가 자체적인 파일 시스템을 위한 캐시 공간을 마련할 수 있게 해주는 것이 좋다.

데이터 파일과 프라이머리 키(인덱스) 구조

  • MyISAM 테이블은 데이터 파일이 힙(Heap) 공간처럼 활용된다.
    • 레코드는 프라이머리 키 값과 무관하게 INSERT되는 순서대로 데이터 파일에 저장된다.
    • 저장되는 레코드는 모두 ROWID라는 물리적인 주솟값을 가진다.
    • 프라이머리 키와 세컨더리 인덱스는 모두 데이터 파일에 저장된 레코드의 REWID 값을 포인터로 가진다.

ROWID 저장 방식

  • 가변 길이 ROWID
    • 자주 사용되지는 않는다.
    • MAX_ROWS 옵션으로 MyISAM 테이블을 생성할 때 최대로 가질 수 있는 레코드가 한정된 테이블을 생성한다.
    • ROWID는 4바이트 정수로, 레코드가 INSERT된 순번이다.
  • 고정 길이 ROWID
    • MAX_ROWS 옵션을 설정하지 않으면 ROWID는 최대 myisam_data_pointer_szie 시스템 변수에 설정된 바이트 수만큼의 공간을 사용할 수 있다.
    • 기본값은 7이므로, 2바이트부터 7바이트까지 가변적인 ROWID를 갖게 된다.
    • 첫 번째 바이트는 ROWID의 길이를 저장하는 용도로 사용하고, 나머지 공간은 실제 ROWID를 저장하는 데 사용한다.
    • 데이터 파일에서 레코드의 위치(offset)가 ROWID로 사용된다.

Reference

참고 서적

📔 Real MySQL 8.0

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글