Page
- 각 스페이스는 16KiB의 페이지로 나누어짐
- UNIV_PAGE_SIZE를 변경하거나, InnoDB 압축을 사용하는경우 변경 가능
- 오프셋 이라고하는 32bit 정수 페이지 번호가 할당됨
- 파일의 시작부분부터 해당 페이지 위치까지의 실제 오프셋임
- 페이지 0은 파일 오프셋 0, 페이지1은 오프셋은 16384(16*1024)임
페이지 구조
- 각 페이지는 38바이트의 FIL(file의 줄임말) header와 FIL Trailer를 가지고 있음
- 헤더에는 페이지의 남은 부분을 결정하는 page type 필드를 포함하고 있음
FIL Header / Trailer
- page type은 페이지의 다른 부분을 파싱하기 위해 필수적인 부분임
- page type은 file space management, extent management, the transaction system, the data dictionary, undo logs, blobs, indexes가 할당될 수 있음
- 페이지는 앞서 나열한 페이지가 될 수 있다는것을 의미함
- 페이지가 초기화 될때, page number(Offset)이 할당됨
- 해당 필드에서 읽은 페이지번호가 파일에 오프셋을 기준으로 해야하는 페이지 번호가 일치하는지 확인하여, 읽기가 올바른지 확인함
- 이 필드가 초기화되면 페이자가 초기화되었다는 것을 의미함
- 해당 페이지의 유형과 같은 이전 페이지와 다음페이지 포인터가 헤더가 저장되어 있음
- 이 필드들로 페이지를 double-linked list 구조가 됨
- 인덱스 페이지를 동일한 수순으로 연결하는데 사용되므로 전체 인덱스 스캔을 효율적으로 수행할 수 있음
- 대부분의 페이지 유형은 이 필드들을 사용하지 않음
Space - tablespace
- 각 테이블당 하나의 space가 존재
- 하나의 스페이스는 .idb파일로 구성됨
- 하나 이상의 idb파일로 구현 될 수 있음
- 물리적으로 하나 이상의 파일이지만, 논리적으로 단일파일 취급함
- .idb파일은 하나의 테이블에 대한 정보가 들어감
- 하나의 .idb파일에 여러 테이블이 들어갈 수 있는 구조지만, 하나의 테이블만 넣음
- space별로 32bit 정수인 space ID가 할당됨
- 해당 space를 참조할 목적
- InnoDB는 InnoDB에서 필요로 하는 장부(book-keeping)를 작성하기 위해 system space를 가지고 있음
- system space의 space ID는 0임
- 많은 페이지가 연결된것
- 효율적으로 페이지를 관리하기 위헤 1MiB 블록 단위로 페이지를 관리함
- 이를 extent라 부름
- 파티션을 나누면 각각의 space가 나누어짐
Space File 구조
- Innodb는 모든 page, extent, space를 추적-관리하기 해야하므로 위와같은 구조를 가짐
- space의 첫번째 페이지(page 0)은 항상 FSP_HDR 또는 file space header 페이지임
- FSP_HDR페이지는 space의 크기, free, fragmented, full extents의 목록을 추적할 수 있는 FSP header 구조를 포함하고 있음
- FSP_HDR페이지는 내부적으로 256 extents(또는 16384페이지, 256MiB)에 대한 정보를 저장 가능함
- 그러므로 256extents마다 XDES정보를 저장하기 위해 공간을 미리 예약해놓음
- XDES와 FSP_HDR페이지는 XDES에서 FSP해더 구조가 0으로 처리된다는 점을 제외하면 동일함
- 추가페이지는 스페이스 파일이 커짐에 따라 할당됨
- 두번째페이지인 IBUF_BITMAP페이지는 insert buffering과 관련된 정보를 저장함(이 글의 범위를 벗어나는 부분이라 더 이상 언급하지 않음)
- 세번째 페이지인 INODE페이지는 파일 세그먼트와 관련된 목록을 저장하는데 사용됨
- 각 INODE페이지에는 85개의 INODE항목을 저장할 수 있으며, 각 인덱스에는 2개의 INODE항목이 필요함
System space
- InnoDB에는 space ID가 0인 system space가 존재함
- InnoDB의 작동에 중요한 정보를 저장하기 위해 고정 페이지 번호로 할당된 페이지가 포함되어 있음
- 다른공간과 마찬가지로 FSP_HDR, IBUF_BITMAP, INODE페이지가 처음 3페이지로 할당되어 있음
- 3번째 SYS페이지에는 insert buffering에 관련된 헤더와 부기정보가 있음
- 4번째 INDEX페이지에는 insert buffering에 관련된 index구조의 루트 페이지가 존재
- 5번째 TRX_SYS페이지에는 InnodDB의 트랜잭션 시스템의 동작과 관련된 정보가 존재함
- 최신 transaction ID, Mysql binary log정보, double write buffer extents의 위치 등
- 6번째 SYS페이지에는 첫번째 롤백 segment page정보가 있음
- rollback segment data의 저장이 필요하다면, 추가적인 페이지가 할당될 수 있음
- 7번째 SYS페이지에는 data dictionary와 관련된 헤더가 있음
- data dictionary를 구성하는 인덱스의 루트 페이지 번호를 포함함
- 루트 페이지 번호가 data dictionary 자체에 저장되므로,다른 인덱스를 찾기 위해 필요함
- 64-127번째 페이지에는 double write buffer에 저장됨
- 128-192번째 페이지에는 두번째 double write buffer
IBD 파일 구조
- 런타임에 인덱스를 생성하는 fast index creation을 제외하고, 필수 초기 3페이지 이후 공간에 할당된 페이지들은 테이블 생성에 정의된 순서대로 테이블에 있는 각 인덱스 루트 페이지가 됨
- 3번째 페이지는 clustered index의 루트페이지, 4번째 페이지는 첫번째 secondary index의 루트페이지임
- InnoDB의 부기 구조는 대부분 시스템 공간에 저장되므로, 테이블별 공간에 할당된 대부분의 페이지는 INDEX유형이며, 테이블 데이터를 저장함
참고
https://blog.jcole.us/2013/01/03/the-basics-of-innodb-space-file-layout/