B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
by
Ryo Tomidokoro
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
@hanhan1978 B+木入門:PHPで理解する データベースインデックスの仕組み PHPerKaigi 2024/03/09
Slide 2
Slide 2 text
@hanhan1978 ● 富所 亮 ● 所属 株式会社カオナビ CTO室 BackEnd Re-architecturing Team (BERT) ● 職業 バックエンドエンジニア ● ブログ https://blog.hanhans.net ● Yokohama North AM https://anchor.fm/yokohama-north-am 2
Slide 3
Slide 3 text
まず基礎的な知識から
Slide 4
Slide 4 text
B木の木って何?
Slide 5
Slide 5 text
コンピューターサイエンスにおける 基本的なデータ構造のひとつ https://en.wikipedia.org/wiki/Tree_(data_structure) 由来がわからない程度には基本
Slide 6
Slide 6 text
データ構造って? 言語によってはありえない質問かも
Slide 7
Slide 7 text
アルゴリズム + データ構造 プログラム
Slide 8
Slide 8 text
アルゴリズム + データ構造
Slide 9
Slide 9 text
アルゴリズム https://ja.wikipedia.org/wiki/アルゴリズム > アルゴリズムとは、解が定まっている「計算可能」問題 に対して、その解を正しく求める手続きをさす。あるいは それを形式的に表現したもの。
Slide 10
Slide 10 text
ようするにプログラム
Slide 11
Slide 11 text
アルゴリズム + データ構造
Slide 12
Slide 12 text
たとえば、PHPの配列 https://www.php.net/manual/ja/language.types.array.php
Slide 13
Slide 13 text
たとえば、PHPの配列 https://www.php.net/manual/ja/language.types.array.php
Slide 14
Slide 14 text
たとえば、PHPの配列 https://www.php.net/manual/ja/language.types.array.php 便利すぎる?
Slide 15
Slide 15 text
私達はもう自然に データ構造を使いこなしていた (過言)
Slide 16
Slide 16 text
余談 https://www.php.net/manual/ja/function.array-is-list.php 配列がリストかどうかをチェックする(錯乱)
Slide 17
Slide 17 text
PHPの配列は便利すぎるデータ構造 https://fortee.jp/phperkaigi-2023/proposal/e00788a4-ef25-49ee-b254-9d2b53e19633
Slide 18
Slide 18 text
PHPの配列は便利すぎるデータ構造2 https://tek.phparch.com/schedule
Slide 19
Slide 19 text
配列は便利すぎる データ構造としての用途ならSPL推奨
Slide 20
Slide 20 text
Standard PHP Library https://www.php.net/manual/ja/spl.datastructures.php
Slide 21
Slide 21 text
データ構造を意識するのはいつ?
Slide 22
Slide 22 text
● 低レイヤー ● 競技プログラミング ● 就活(leetcode) ● パフォーマンス改善 PHPの仕事ではあんまりデータ構造を意識しないかも
Slide 23
Slide 23 text
LeetCode https://leetcode.com/
Slide 24
Slide 24 text
● 低レイヤー ● 競技プログラミング ● 就活(leetcode) ● パフォーマンス改善 PHPの仕事ではあんまりデータ構造を意識しないかも
Slide 25
Slide 25 text
アルゴリズムだけだと どうしても改善できないことがある
Slide 26
Slide 26 text
そのため、やりたいことに合わせて データ構造とアルゴリズムを変える
Slide 27
Slide 27 text
例えば ● [データ構造] リスト ● [アルゴリズム] ループ PHPの文字列リストから、特定の文字を探す場合
Slide 28
Slide 28 text
例えば ● [データ構造] リスト ● [アルゴリズム] ループ PHPの文字列リストから、特定の文字を探す場合 O(N)
Slide 29
Slide 29 text
例えば ● [データ構造] リスト ● [アルゴリズム] Binary Search 整列されたデータであった場合
Slide 30
Slide 30 text
例えば ● [データ構造] リスト ● [アルゴリズム] Binary Search 整列されたデータであった場合 O(LogN)
Slide 31
Slide 31 text
計算量のおさらい https://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量/
Slide 32
Slide 32 text
計算量 整列されてないデータ 整列されているデータ O(N) 単純ループ O(logN) Binary Search
Slide 33
Slide 33 text
アルゴリズム単体での限界 この先はデータ構造の助けがいる
Slide 34
Slide 34 text
例えば PHPでのよくある解決策としては 配列の値をhashのキーに置き換える
Slide 35
Slide 35 text
例えば ● [データ構造] HashMap ● [アルゴリズム] キーの存在チェック
Slide 36
Slide 36 text
例えば ● [データ構造] HashMap ● [アルゴリズム] キーの存在チェック O(1)
Slide 37
Slide 37 text
計算量のおさらい https://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量/
Slide 38
Slide 38 text
ここまでのまとめ
Slide 39
Slide 39 text
アルゴリズムだけでは、限界があるの でデータ構造を工夫する必要がある
Slide 40
Slide 40 text
つまり、データ構造は向いているアル ゴリズムがある
Slide 41
Slide 41 text
C言語とか書いてた人は そりゃデータ構造いるだろ? 何いってんだ?となる
Slide 42
Slide 42 text
ここからB木の話
Slide 43
Slide 43 text
B木 1972年にBayerとMcCreightが発表した 論文 ORGANIZATION AND MAINTENANCE OF LARGE ORDERED INDICES Boeing Research Labs に所属していた
Slide 44
Slide 44 text
B木の特徴 データアクセスを最小限にしつつ、データを効率的に保 存するためのデータ構造として生み出された。
Slide 45
Slide 45 text
B木の特徴 平衡木という特徴がある 二分木の場合 -> 偏った木になる可能性がある
Slide 46
Slide 46 text
偏った木
Slide 47
Slide 47 text
偏った木 ルートから3回の値比較が必要
Slide 48
Slide 48 text
平衡木
Slide 49
Slide 49 text
平衡木 全体の深さが同じになる
Slide 50
Slide 50 text
B木は挿入、削除で木の調整を行う
Slide 51
Slide 51 text
全体として バランスの取れた状態になる
Slide 52
Slide 52 text
ここでピンと来るかもしれない
Slide 53
Slide 53 text
B木は挿入、削除で木の調整を行う
Slide 54
Slide 54 text
データベースのインデックス追加時のコスト 平衡木はデータ追加時に木に調整が必要
Slide 55
Slide 55 text
5を加えたらどうなる?
Slide 56
Slide 56 text
これは平衡でない
Slide 57
Slide 57 text
高さが一定になるように調整される この”調整”がいわゆるコスト
Slide 58
Slide 58 text
このコストはどれくらいなのか?
Slide 59
Slide 59 text
5を加えることを考える
Slide 60
Slide 60 text
1. 挿入箇所を探す ルートからキーを比較して挿入箇所のノードを探す
Slide 61
Slide 61 text
2. 挿入処理を行う 探した挿入箇所にノードを追加する
Slide 62
Slide 62 text
3. ノード数が次数に達したら上にマージ 3,4,5で分裂した木をルートに向けてマージする
Slide 63
Slide 63 text
3. ノード数が次数に達したら上にマージ もし、ここも満杯になったら同じ処理を上に向かって繰り返す
Slide 64
Slide 64 text
O(logN) で探す + O(logN) でマージ
Slide 65
Slide 65 text
2 x O(logN) の計算量で インデックスの再構築が行われる
Slide 66
Slide 66 text
基本的にはデータを挿入するノードに 至るまでの経路上のノードに対して再 帰的に処理を行えば平衡が保たれる
Slide 67
Slide 67 text
経路外のノードは調整しない そこまで仕様は複雑じゃない
Slide 68
Slide 68 text
B木の特徴 また、もう一つの大きな特徴として 外部メモリ使用時の有用性
Slide 69
Slide 69 text
最近はインメモリデータベースなども ありますが、一般的にはデータベース はストレージ(HDD, SSD) にデータを 保存
Slide 70
Slide 70 text
OSのシステムコールはブロック単位で データの読み書きを行う 通常は4096バイト
Slide 71
Slide 71 text
必要なデータが1バイトだったとして も4096バイトの読み込み
Slide 72
Slide 72 text
昔のHDD ぐるぐる回るシリンダー から、データを読み取る ため、ブロック効率が良 くないともったいない! SSDで読み取りが早く なったとはいえ、無駄の ないデータIOはデータ ベースの鍵
Slide 73
Slide 73 text
B木はノードのサイズを設計可能 例えば 4バイト整数のキーで、ノード のインデックスも4バイトの場合
Slide 74
Slide 74 text
(4+4) x 2B = 8 x 512 = 4096 バイト このように外部メモリに対してあらか じめデータ量を計算できる
Slide 75
Slide 75 text
なんでB木はデータベースインデック スで使われるの?
Slide 76
Slide 76 text
因果関係が逆
Slide 77
Slide 77 text
Randomに配置された大量の書類のイ ンデックスを効率的に管理するために 作られたのがB木
Slide 78
Slide 78 text
実際のB木の動き(デモ)
Slide 79
Slide 79 text
B+木 B木の特徴を保持しつつ、実用的な機能性を付加 論文 The Ubiquitous B-Tree
Slide 80
Slide 80 text
データ構造のイメージ
Slide 81
Slide 81 text
B+木 平衡を保つ基本的な仕組みはB木と同じ ただし、リーフノードにすべてのデータを保持
Slide 82
Slide 82 text
データ構造のイメージ リーフにすべてのデータが並ぶ
Slide 83
Slide 83 text
木の高さが変わってもリーフにすべてのデータが並ぶ
Slide 84
Slide 84 text
B+木の検索 3を探す場合は近傍のノードから到達
Slide 85
Slide 85 text
リーフがポインターを数珠つなぎにもつため 範囲検索も可能
Slide 86
Slide 86 text
検索 始点・終点でリーフだけで範囲を取得できる
Slide 87
Slide 87 text
カバリングインデックス(おまけ) インデックスのデータのみを取得する場合
Slide 88
Slide 88 text
カバリングインデックス(おまけ) インデックス検索以後の処理が必要ない
Slide 89
Slide 89 text
本当は実装が完了したリポジトリリンクを バシッと貼りたかったが 未完...orz 口でいうほど全然簡単じゃなかった
Slide 90
Slide 90 text
まとめ
Slide 91
Slide 91 text
データベースのインデックスが速いのは インデックスのデータ構造が専用につくら れているから
Slide 92
Slide 92 text
古典 インデックスサイズの正確な計算を実感するにはやはりC
Slide 93
Slide 93 text
安定のラムダノート この本には何度も命を救われている