DBとアルゴリズム2021/09/09山田悠之介
View Slide
Web の技術とアルゴリズムアルゴリズムの理論には純粋なパズル的な楽しさがあるWeb の技術ではプラクティカルな話が中心で理論の話は多くない(そんな事ないよって方の LT をお待ちしています)DB は理論の話が多く面白い今回は DB にまつわるアルゴリズムのうち、木に関するものを紹介2
流れデータ構造をいくつか紹介BSTB-treeLSM tree(主題)時間があれば LSM tree における最適化をいくつか紹介3
BST(二分探索木)右部分木のノードは親より大きく、左部分木のノードは親より小さい多くの言語で Map, Set の実装に使われる4
BST(二分探索木)バランスしている時、読み込み・書き込み(INSERT, UPDATE, DELETE)がO(log N)5
BST はディスクと相性が悪いバランシングが頻発する → ディスクの読み書きが増えるノードサイズとページサイズと合っていない6
B-tree (B+ tree)ディスクに最適化された探索木多くの RDBMS (MySQL, PostgreSQL など) のストレージエンジンでインデックスとして用いられている7
B-tree (B+ tree)ディスク最適化各ノードの大きさをページサイズに合わせるバランシングも兄弟への分割・兄弟とのマージなので局所的8
B-tree の向き・不向き読み込み・書き込みともに だが、書き込みが多いユースケースではボトルネックになるミュータブルなので排他制御が必要O(log N)9
LSM tree書き込みに最適化されたデータ構造Cassandra などの NoSQL, Spanner などの分散 DB で用いられる書き込みが 、読み込みが 書き込み時はメモリとログに書くだけにして、重複を読み込み時に解決するディスク上のコンポーネントはイミュータブルで、ロックなしで読み書きできるO(1) O(N)10
LSM tree小さなメモリ上のコンポーネント (memtable)大きなディスク上のコンポーネント(複数)からなる11
LSM tree全ての書き込みは memtable に適用される耐久性を保証するためにログファイルが必要となるmemtable はサイズが閾値になると,ディスク上に永続化されるディスク上のデータ構造は B-tree が一般的 12
LSM treeフラッシュ後のテーブルの数を抑えるために定期的にマージする(コンパクション)コンパクションではマージされた結果を新しいファイルに書き出す(イミュータブル)13
LSM tree の書き込みと読み込み追加・更新は memtable に新たに key と value を追加するだけ削除では memtable からデータレコードを削除するだけでは不十分(ディスク上のコンポーネントが同じキーのデータレコードを保持している可能性がある)value に特別な削除エントリ(墓石)を割り当てることで対応読み込みでは複数のコンポーネントにアクセスし、タイムスタンプを比較して最新の結果を返すようにする→ どのコンポーネントにレコードがあるか知りたい14
Leveled compactionレベル 0 はフラッシュされたテーブルがそのまま入るレベル 1 以降は上のレベルからマージされ、key の範囲が各レベルで被らないようにすることで探索を最適化する15
Bloom Filter各レベルである key がどのテーブルの範囲にあるかはわかるが、本当にそのテーブルにあるかは分からないBloom filter という確率的データ構造がよく使われる16
Bloom Filter構築時: 要素の key に対して hash 値のビットを全て立てる (ビット配列は共有)探索時: hash 値のビットが全て立っていれば要素かもしれない、 そうでなければ要素ではない17
まとめB-tree は読み込み・書き込みともに優れたデータ構造特殊なケースでは書き込みに特化した LSM tree が使われるLSM tree の読み取りを改善する最適化がいろいろある18
参考資料Database Internals19