티스토리 뷰
InnoDB 스토리지 엔진 아키텍처 1
InnoDB 스토리지 엔진 아키텍처 2
InnoDB 스토리지 엔진 아키텍처 3
MyISAM 스토리지 엔진 아키텍처
이번에는 MyISAM 스토리지 엔진의 성능에 영향을 미치는 요소인 키 캐시와 운영체제의 캐시/버퍼에 대해 살펴보자.
아래는 MyISAM의 간략한 구조이다.
키 캐시
InnoDB의 버퍼 풀과 비슷한 역할을 하는 것이 MyISAM의 키 캐시(Key cache, 키 버퍼라고도 불림)다. 하지만 이름 그대로 MyISAM 키 캐시는 인덱스만을 대상으로 작동하며, 또한 인덱스의 디스크 쓰기 작업에 대해서만 부분적으로 버퍼링 역할을 한다.
key_reads는 인덱스를 디스크에서 읽어 들인 횟수를 저장하는 상태 변수이며, key_read_requests는 키 캐시로부터 인덱스를 읽은 횟수를 저장하는 상태 변수다.
운영체제의 캐시 및 버퍼
MyISAM 테이블의 인덱스는 키 캐시를 이용해 디스크를 검색하지 않고도 빠르게 검색할 수 있다. 하지만 MyISAM 테이블의 데이터에 대해서는 디스크로부터의 I/O를 해결해 줄 만한 어떠한 캐시나 버퍼링 기능도 MyISAM 스토리지 엔진은 가지고 있지 않다. 때문에 MyISAM 테이블의 데이터 읽기나 쓰기 작업은 항상 운영체제의 디스크 읽기 또는 쓰기 작업으로 요청될 수 밖에 없다. 물론 대부분의 운영체제에서는 디스크로부터 읽고 쓰는 파일에 대한 캐시나 버퍼링 메커니즘을 탑재하고 있기 때문에 MySQL 서버가 요청하는 읽기 작업을 위해 매번 디스크의 파일을 읽지는 않는다.
MyISAM이 주로 사용되는 MySQL에서 일반적으로 키 캐시는 최대 물리 메모리의 40% 이상을 넘지 않게 설정하고, 나머지 메모리 공간은 운영체제가 자체적인 파일 시스템을 위한 캐시 공간을 마련할 수 있게 해주는 것이 좋다.
데이터 파일과 프라이머리 키(인덱스) 구조
InnoDB 스토리지 엔진을 사용하는 테이블은 프라이머리 키에 의해서 클러스터링 되어 저장되는 반면, MyISAM 테이블은 프라이머리 키에 의한 클러스터링 없이 데이터 파일이 힙(Heap) 공간처럼 활용된다. 즉, MyISAM 테이블에 레코드는 프라이머리 키 값과 무관하게 INSERT되는 순서대로 데이터 파일에 저장된다. 또한, MyISAM 테이블에 저장되는 레코드는 모두 ROWID라는 물리적인 주솟값을 가지는데, 프라이머리 키와 세컨더리 인덱스는 모두 데이터 파일에 저장된 레코드의 ROWID 값을 포인터로 가진다.
MyISAM 테이블에서 ROWID는 고정 길이와 가변 길이의 두 가지 방법으로 저장될 수 있다.
고정 길이 ROWID
MyISAM 테이블은 ROWID 값으로 4바이트 정수를 사용하며, 레코드가 INSERT된 순번이 ROWID로 사용된다.
가변 길이 ROWID
myisam_data_pointer_size 시스템 변수의 기본값은 7이므로 MyISAM 테이블의 ROWID는 2바이트부터 7바이트까지 가변적인 ROWID를 갖게 되는데, 첫 번째 바이트는 ROWID의 길이를 저장하는 용도로 사용하고 나머지 공간은 실제 ROWID를 저장하는데 사용한다.
요약
- MyISAM의 키 캐시는 인덱스를 대상으로만 작동하며, 인덱스의 쓰기 작업에 대해서만 부분적으로 버퍼링 역할을 한다.
- MyISAM은 어떠한 캐시나 버퍼링 기능도 없기 때문에 데이터 I/O 작업은 항상 운영체제의 디스크 I/O 작업으로 요청될 수 밖에 없다.
- MyISAM 테이블의 레코드는 PK 값과 무관하게 INSERT되는 순서대로 데이터 파일에 저장되며, 저장된 레코드의 ROWID 값을 포인터로 갖는다.
Reference
백은빈, 이성욱. 『Real MySQL 8.0』. 위키북스, 2022
'MySQL' 카테고리의 다른 글
[MySQL] 잠금 (Lock) (1) | 2023.01.28 |
---|---|
[MySQL] 트랜잭션 (0) | 2023.01.27 |
[MySQL] InnoDB 스토리지 엔진 아키텍처 3 (0) | 2023.01.24 |
[MySQL] InnoDB 스토리지 엔진 아키텍처 2 (0) | 2023.01.22 |
[MySQL] InnoDB 스토리지 엔진 아키텍처 1 (0) | 2023.01.21 |
- Total
- Today
- Yesterday
- 스프링
- 북클럽
- kotlin
- webflux
- 노마드코더
- 리팩토링
- Refactoring
- 그리디
- 데이터베이스
- 코테
- 코틀린
- 노마드
- 백준
- mysql 8.0
- 릿코드
- 문자열
- Spring
- Algorithm
- 알고리즘
- Real MySQL
- 정렬
- spring boot
- MySQL
- 스프링 부트
- 인프런
- 김영한
- 구현
- 파이썬
- leetcode
- 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |