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

安定のラムダノート この本には何度も命を救われている