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 방식으로 데이터를 저장하도록 한다.
Innodb는 2가지 파일 형식으로 저장을 하는데 이 때 행 저장방식을 4가지 형태로 저장할 수 있다.
1. Antelope : 5.0 이전에 Innodb에서 사용하던 파일 형식, 행 저장방식으로 Compact와 Redundant를 지원한다.
2. Barracuda : 새로 추가된 파일 형식, Antelope이 제공하던 Compact와 Redundant는 물론이고 Compressed와 Dynamic 행 저장방식 또한 지원한다.
mysql 5.7.9 이 후 버전에는 기본 행 형식 변수 Innodb_default_row_format 에 의해 결정되도록 변경되었고 기본값을 Dynamic으로 설정되었다.
다음과 같은 DDL에서 설정 또한 가능하다.
CREATE TABLE row_test_tbl
(
a int PRIMARY KEY,
b int
)ROW_FORMAT=DYNAMIC;
이 전 버전에서 사용하던 Compact나 Redundant를 최근 행 저장방식인 Compressed나 Dynamic으로 변경하려면
먼저 파일 형식을 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://enterone.tistory.com/230
https://purumae.tistory.com/209
https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html
'Database > Mysql & Mariadb' 카테고리의 다른 글
MySQL Online DDL(8) [Table Operations] (0) | 2021.11.09 |
---|---|
innodb 행 저장 방식(2) 행 저장 방식 (0) | 2021.11.08 |
MySQL Online DDL(7) [Foreign key Operations] (0) | 2021.11.01 |
MySQL Online DDL(6) [Generated Column Operations] (0) | 2021.11.01 |
MySQL Online DDL(5) [Column Operations] (0) | 2021.11.01 |
최근댓글