バベルの図書館は完成しない

Extended outer memory module
for my poor native memory.

Posts:
2020/09/28 gendoc という YAML からドキュメントを生成するコマンドを作った
2020/09/13 ISUCON10 の予選を 7 位で通過した
2019/12/01 Puma の内部構造やアーキテクチャを追う
2019/05/27 Golang の正規表現ライブラリの処理の流れをざっくり掴む
2019/04/29 InnoDB の B+Tree Index について
2019/04/29 InnoDB における index page のデータ構造
2019/04/28 InnoDB はどうやってファイルにデータを保持するのか
2019/01/06 Designing Data-Intensive Applications を読んでいる
2019/01/03 年末年始に読んだ本について、など
2019/01/01 Ruby から ffi を使って Rust を呼ぶ
2018/11/10 ブラウザにおける状態の持ち方
2018/07/01 Rust で web アプリ、 或いは Rust における並列処理
2018/05/14 なぜテストを書くのか
2018/05/13 Rust で wasm 使って lifegame 書いた時のメモ
2018/03/12 qemu で raspbian のエミュレート(環境構築メモ)
2018/03/12 qemu で xv6 のエミュレート(環境構築メモ)
2018/03/03 Ruby の eval をちゃんと知る
2018/02/11 Web のコンセプト
2018/02/03 Rspec のまとめ
2018/02/03 Ruby を関数型っぽく扱う

InnoDB における index page のデータ構造

一つ前の記事に引き続き、今回は index page のデータ構造について。

InnoDB の index の性質

InnoDB は B+Tree を利用した index を基本構造としており、またデータの保持を行う際には cluster index というデータ構造を採用している。

仮に CREATE TABLE 文が発行されたタイミングで PRIMARY KEY が指定されていなかった場合には、最初に出てきた 非 NULL で UNIQUE なカラム をベースに cluster index が構築される。

それも存在しなかった場合には暗黙的に 48-bit の Row ID というカラムが cluster index のベースキーとして作成される。

index page の構造

16 KB(= 16384 bytes) で構成される page のうち、先頭 38 bytes と末尾 8 bytes は前回の記事で紹介した通り FIL Header, FIL Trailer と呼ばれるヘッダとトレイラが置かれている。この部分で前後の index page へのポインタを保持する。

それらも含めて構造を記載すると以下のようになる。

Index Header

36 bytes の構成は以下。

Index System Records

全ての index page は infimumsupremum と呼ばれる 2 つの system record を保持している。

infimum はその index page に存在するどの record よりも低く最大の key 値を持ち、next record として user record 内で最小の key 値の record を持つ。 supremum は対照的にどの record よりも高く最小の key 値を持つ。

これによって page 全体を走査しなくてもスキップする page というのを特定することができるっぽい。

参考

2019/04/29 12:43
tags: mysql - db - innodb
This site is maintained by furuhama yusuke.
from 2018.02 -