[InnoDB Engine] 페이지란?
페이지란?
DB에서 행(Row)을 저장할 때 실제 물리적으로 디스크에 담기는 단위는 '페이지'로 관리됩니다.
하나의 페이지에는 여러개의 행이 담긴다고 볼 수 있습니다.
페이지의 목적
효율적인 데이터 관리와 성능을 위해 데이터베이스 시스템에서 자주 사용됩니다.
페이지 단위로 데이터 접근을 최적화하면, 데이터 조회와 수정 시 성능을 향상시킬 수 있습니다.
페이지 크기는 디스크 I/O를 줄이고, 캐시 메모리 사용을 최적화하는 데 도움이 됩니다.
페이지는 메모리 내에서 효율적으로 데이터를 캐싱하고, 페이지를 통해 데이터 접근을 관리합니다.
페이지의 특징
InnoDB에서는 데이터와 인덱스가 디스크에 저장될 때 페이지라는 블록 단위로 나뉩니다.
각 페이지는 고정된 크기를 가지며, 일반적으로 4KB, 8KB, 16KB, 또는 32KB로 설정할 수 있습니다.
페이지 크기 확인
SHOW VARIABLES LIKE 'innodb_page_size';
페이지 저장 방식의 종류
redundant
이노 디비 초기 사용 방식
구조: 데이터 페이지 내에 데이터의 모든 필드가 저장됩니다. 페이지가 꽉 차면, 페이지의 끝에 있는 필드 값은 오프페이지에 저장됩니다.
데이터를 페이지 내에 직접 저장한다.
compact
768 바이트만 데이터를 저장하고 나머지 데이터는 Off-Page에 저장하며 해당 데이터에 대한 포인터는 페이지에 저장합니다.
Off-Page는 아래에서 다시 설명합니다.
dynamic
페이지 크기보다 작으면 데이터를 페이지 안에 저장하고 페이지 크기 보다 크면 Off-Page에 데이터를 추가적으로 저장합니다.
페이지 저장 방식 확인
SELECT TABLE_NAME, ROW_FORMAT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'mydatabase';
테이블의 페이지 저장 방식을 확인할 수 있습니다.
Overflow page(Off-Page)
페이지 하나에 4KB라고 했을 때 가변 길이 열이 페이지 크기를 초과하면 페이지의 크기와 구조를 효율적으로 사용하기 위해 데이터의 일부만 페이지에 저장하고, 나머지 데이터를 별도의 Off-Page에 저장합니다.
이렇게 하면 페이지의 내부 공간을 절약할 수 있습니다.
데이터 전체를 페이지에 저장하면 되는데 왜 Off-Page가 존재할까?
페이지 간에 데이터를 연속적으로 저장하는 것은 페이지의 목적에 맞지 않습니다.
위에서 서술한 페이지의 목적을 보면 데이터를 잘 찾기 위한 기능을 위해서 존재하는 것이지 데이터를 저장하는 목적은 아닌 것을 알 수 있습니다.
Off-page에 저장되는 것은 페이지의 효율적인 사용을 위함이고 Off-page에 저장된 데이터를 실제 조회하면 속도가 저하됩니다.
데이터가 페이지 내에 저장되는 것이 검색 성능에 더 유리하며, 페이지 캐시의 효율성을 높입니다.
페이지 상태 확인
SHOW ENGINE INNODB STATUS;
위의 명령어를 이용하면 현재 할당된 페이지의 수, 수정된 페이지, 더러운 페이지(Dirty Page)의 비율을 확인할 수 있습니다.
Dirty Page란 데이터베이스의 버퍼 풀에서 수정되었지만 아직 디스크에 기록되지 않은 페이지를 의미합니다
이 비율이 높다면 데이터베이스가 더 자주 디스크에 데이터를 플러시해야 한다는 것을 의미할 수 있습니다.
생각해볼 수 있는 것
만약에 페이지 크기가 16kb라면 8192개의 글자를 저장할 수 있습니다.
하지만 이보다 크기를 넘어버리면 Off-Page에 넘어가버리므로 속도 저하는 피해갈 수 없습니다.
예를 들어 Json을 통째로 문자열로 치환해 컬럼에 저장한다면 데이터베이스 속도저하의 가능성이 높아지겠습니다.