innodb 행 저장 방식(1) 저장 파일 형식

Database/Mysql & Mariadb / /
728x90

InnoDB Engine는 형식에 따라 행이 실제로 저장되는 방식을 다르게 설정할 수 있다.

또한 행 저장방식에 따라 DML 작업 성능에도 영향을 미친다.

그 이유는 단일 디스크 페이지에 더 많은 행이 들어가게 되어 쿼리 및 인덱스 조회가 빠르게 작동하고 Buffer Pool에 필요한 Cache Memory가 적게 됩니다.

 

각 테이블은 페이지로 저장되는데 페이지는 B-Tree 구조로 정렬됩니다.

InnoDB는 다음과 같은 순서로 정하여 Clustered Index와 비슷한 형태의 B-tree 구조를 가진다.

1.      Primary Key 가 있다면 해당 Key를 기반으로 B-tree 구조

2.      Primary Key가 없고 Clustered Index가 따로 있다면 해당 Index를 기반으로 B-tree 구조

3.      Primary Key, 명명된 Clustered Index가 없다면 NOT NULL 속성의 Unique Index 기반으로 B-tree 구조

4.      위 모든 후보가 없다면 auto_increment 속성의 보이지 않는 컬럼을 추가하여 해당 컬럼을 기반으로 B-tree 구조

 

페이지는 변수에 따라 4kb, 8kb, 16kb, 32kb로 지정할 수 있고 maximum row length는 페이지 크기에 절반 미만이야 한다. (기본값은 16kb 이다.)

 

가변 길이 열은 열 값이 B-트리 인덱스 노드에 저장되는 규칙의 예외다.

B-트리 페이지에 맞추기에는 너무 긴 가변 길이 열은

오버플로 페이지(Overflow page –일반적으로Uncompressed BLOB Page) 라고 불리는

별도로 할당된 디스크 페이지에 저장되는데 이러한 열을 오프페이지(off-page) 열이라고 한다.

l  compact + Redundant

1)      현재 페이지(B+Tree 리프 노드)에서 처음 768Byte를 유지하고 나머지 데이터는 오버플로 페이지에 저장

2)      768Byte 뒤에는 오버플로 페이지에 대한 포인터를 저장하는 20Byte 데이터 존재

l  Dynamic + Compressed

1)      오버플로 페이지에 대한 포인터를 저장하는 20Byte 데이터만 저장.


 

위 방식을 통해 테이블을 B-tree 방식으로 데이터를 저장하도록 한다.

Innodb2가지 파일 형식으로 저장을 하는데 이 때 행 저장방식을 4가지 형태로 저장할 수 있다.


1.     Antelope : 5.0 이전에 Innodb에서 사용하던 파일 형식, 행 저장방식으로 CompactRedundant를 지원한다.

2.     Barracuda : 새로 추가된 파일 형식, Antelope이 제공하던 Compact Redundant는 물론이고 CompressedDynamic 행 저장방식 또한 지원한다.

 

mysql 5.7.9 이 후 버전에는 기본 행 형식 변수 Innodb_default_row_format 에 의해 결정되도록 변경되었고 기본값을 Dynamic으로 설정되었다.

다음과 같은 DDL에서 설정 또한 가능하다.

CREATE TABLE row_test_tbl

(

  a int PRIMARY KEY,

  b int

)ROW_FORMAT=DYNAMIC;

 

이 전 버전에서 사용하던 CompactRedundant를 최근 행 저장방식인 CompressedDynamic으로 변경하려면

먼저 파일 형식을 Antelope에서 Barracuda로 변경해야 하는데 이 때 설정은 global setting을 다음과 같이 변경한다.

SET GLOBAL innodb_file_format=Barracuda;

 

이후 ALTER TABLE 에서 변경이 가능하다.

ALTER TABLE row_test_tbl ROW_FORMAT=COMPRESSED;

 

참조

https://myinfrabox.tistory.com/59

https://runebook.dev/ko/docs/mariadb/innodb-redundant-row-format/index

https://velog.io/@keywookim/MySQL-%EB%84%A4-%EA%B0%80%EC%A7%80-ROW%ED%98%95%EC%8B%9DREDUNDANT-COMPACT-DYNAMIC-COMPRESSED

https://enterone.tistory.com/230

https://purumae.tistory.com/209

https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기