$30 off During Our Annual Pro Sale. View Details »

DB Tree Algorithms

DB Tree Algorithms

Yunosuke Yamada

October 16, 2022
Tweet

More Decks by Yunosuke Yamada

Other Decks in Programming

Transcript

  1. DBとアルゴリズム
    2021/09/09

    山田悠之介

    View Slide

  2. Web の技術とアルゴリズム
    アルゴリズムの理論には純粋なパズル的な楽しさがある
    Web の技術ではプラクティカルな話が中心で理論の話は多くない

    (そんな事ないよって方の LT をお待ちしています)
    DB は理論の話が多く面白い
    今回は DB にまつわるアルゴリズムのうち、木に関するものを紹介
    2

    View Slide

  3. 流れ
    データ構造をいくつか紹介
    BST
    B-tree
    LSM tree(主題)
    時間があれば LSM tree における最適化をいくつか紹介
    3

    View Slide

  4. BST(二分探索木)
    右部分木のノードは親より大きく、左部分木のノードは親より小さい
    多くの言語で Map, Set の実装に使われる
    4

    View Slide

  5. BST(二分探索木)
    バランスしている時、読み込み・書き込み

    (INSERT, UPDATE, DELETE)がO(log N)
    5

    View Slide

  6. BST はディスクと相性が悪い
    バランシングが頻発する → ディスクの読み書きが増える
    ノードサイズとページサイズと合っていない
    6

    View Slide

  7. B-tree (B+ tree)
    ディスクに最適化された探索木
    多くの RDBMS (MySQL, PostgreSQL など) のストレージエンジン
    でインデックスとして用いられている
    7

    View Slide

  8. B-tree (B+ tree)
    ディスク最適化
    各ノードの大きさをページサイズに合わせる
    バランシングも兄弟への分割・兄弟とのマージなので局所的
    8

    View Slide

  9. B-tree の向き・不向き
    読み込み・書き込みともに だが、

    書き込みが多いユースケースではボトルネックになる
    ミュータブルなので排他制御が必要
    O(log N)
    9

    View Slide

  10. LSM tree
    書き込みに最適化されたデータ構造
    Cassandra などの NoSQL, Spanner などの分散 DB で用いられる
    書き込みが 、読み込みが

    書き込み時はメモリとログに書くだけにして、

    重複を読み込み時に解決する
    ディスク上のコンポーネントはイミュータブルで、
    ロックなしで読み書きできる
    O(1) O(N)
    10

    View Slide

  11. LSM tree
    小さなメモリ上のコンポーネント (memtable)
    大きなディスク上のコンポーネント(複数)
    からなる
    11

    View Slide

  12. LSM tree
    全ての書き込みは memtable に適用される

    耐久性を保証するためにログファイルが必要となる
    memtable はサイズが閾値になると,ディスク上に永続化される

    ディスク上のデータ構造は B-tree が一般的 12

    View Slide

  13. LSM tree
    フラッシュ後のテーブルの数を抑えるために定期的にマージする

    (コンパクション)

    コンパクションではマージされた結果を新しいファイルに書き出す

    (イミュータブル)
    13

    View Slide

  14. LSM tree の書き込みと読み込み
    追加・更新は memtable に新たに key と value を追加するだけ
    削除では memtable からデータレコードを削除するだけでは不十分

    (ディスク上のコンポーネントが同じキーのデータレコードを

    保持している可能性がある)

    value に特別な削除エントリ(墓石)を割り当てることで対応
    読み込みでは複数のコンポーネントにアクセスし、

    タイムスタンプを比較して最新の結果を返すようにする

    → どのコンポーネントにレコードがあるか知りたい
    14

    View Slide

  15. Leveled compaction
    レベル 0 はフラッシュされたテーブルがそのまま入る

    レベル 1 以降は上のレベルからマージされ、

    key の範囲が各レベルで被らないようにすることで探索を最適化する
    15

    View Slide

  16. Bloom Filter
    各レベルである key がどのテーブルの範囲にあるかはわかるが、

    本当にそのテーブルにあるかは分からない
    Bloom filter という確率的データ構造がよく使われる
    16

    View Slide

  17. Bloom Filter
    構築時:
     要素の key に対して hash 値のビットを全て立てる

     (ビット配列は共有)

    探索時:
      hash 値のビットが全て立っていれば要素かもしれない、

     そうでなければ要素ではない
    17

    View Slide

  18. まとめ
    B-tree は読み込み・書き込みともに優れたデータ構造
    特殊なケースでは書き込みに特化した LSM tree が使われる
    LSM tree の読み取りを改善する最適化がいろいろある
    18

    View Slide

  19. 参考資料
    Database Internals
    19

    View Slide