Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
Search
Ryo Tomidokoro
March 10, 2024
Technology
5
4.7k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
PHPerKaigi 2024 の登壇資料です
Ryo Tomidokoro
March 10, 2024
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
6
1.5k
集中して作業する技術/how_to_work_deeply
hanhan1978
61
44k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
9.5k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.7k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5.6k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
16
12k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
1
1.5k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
2.2k
Other Decks in Technology
See All in Technology
Fearsome File Formats
ange
0
550
ハイテク休憩
sat
PRO
2
190
ネットワーク可視化の世界
likr
7
5.6k
生成AIによるテスト設計支援プロセスの構築とプロセス内のボトルネック解消の取り組み / 20241220 Suguru Ishii
shift_evolve
0
160
AWS re:Invent 2024 ふりかえり勉強会
yhana
0
680
【令和最新版】ロボットシミュレータ Genesis x ROS 2で始める快適AIロボット開発
hakuturu583
2
1.4k
DUSt3R, MASt3R, MASt3R-SfM にみる3D基盤モデル
spatial_ai_network
3
480
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
1
530
30分でわかるデータ分析者のためのディメンショナルモデリング #datatechjp / 20250120
kazaneya
PRO
13
3.4k
React Routerで実現する型安全なSPAルーティング
sansantech
PRO
4
810
mixi2 の技術スタックを探ってみる (アプリ編)
ichiki1023
0
110
開発生産性向上! 育成を「改善」と捉えるエンジニア育成戦略
shoota
2
820
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
137
6.7k
Speed Design
sergeychernyshev
25
720
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.2k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
940
Side Projects
sachag
452
42k
How to Ace a Technical Interview
jacobian
276
23k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Site-Speed That Sticks
csswizardry
2
220
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
What's in a price? How to price your products and services
michaelherold
244
12k
Transcript
@hanhan1978 B+木入門:PHPで理解する データベースインデックスの仕組み PHPerKaigi 2024/03/09
@hanhan1978 • 富所 亮 • 所属 株式会社カオナビ CTO室 BackEnd Re-architecturing
Team (BERT) • 職業 バックエンドエンジニア • ブログ https://blog.hanhans.net • Yokohama North AM https://anchor.fm/yokohama-north-am 2
まず基礎的な知識から
B木の木って何?
コンピューターサイエンスにおける 基本的なデータ構造のひとつ https://en.wikipedia.org/wiki/Tree_(data_structure) 由来がわからない程度には基本
データ構造って? 言語によってはありえない質問かも
アルゴリズム + データ構造 プログラム
アルゴリズム + データ構造
アルゴリズム https://ja.wikipedia.org/wiki/アルゴリズム > アルゴリズムとは、解が定まっている「計算可能」問題 に対して、その解を正しく求める手続きをさす。あるいは それを形式的に表現したもの。
ようするにプログラム
アルゴリズム + データ構造
たとえば、PHPの配列 https://www.php.net/manual/ja/language.types.array.php
たとえば、PHPの配列 https://www.php.net/manual/ja/language.types.array.php
たとえば、PHPの配列 https://www.php.net/manual/ja/language.types.array.php 便利すぎる?
私達はもう自然に データ構造を使いこなしていた (過言)
余談 https://www.php.net/manual/ja/function.array-is-list.php 配列がリストかどうかをチェックする(錯乱)
PHPの配列は便利すぎるデータ構造 https://fortee.jp/phperkaigi-2023/proposal/e00788a4-ef25-49ee-b254-9d2b53e19633
PHPの配列は便利すぎるデータ構造2 https://tek.phparch.com/schedule
配列は便利すぎる データ構造としての用途ならSPL推奨
Standard PHP Library https://www.php.net/manual/ja/spl.datastructures.php
データ構造を意識するのはいつ?
• 低レイヤー • 競技プログラミング • 就活(leetcode) • パフォーマンス改善 PHPの仕事ではあんまりデータ構造を意識しないかも
LeetCode https://leetcode.com/
• 低レイヤー • 競技プログラミング • 就活(leetcode) • パフォーマンス改善 PHPの仕事ではあんまりデータ構造を意識しないかも
アルゴリズムだけだと どうしても改善できないことがある
そのため、やりたいことに合わせて データ構造とアルゴリズムを変える
例えば • [データ構造] リスト • [アルゴリズム] ループ PHPの文字列リストから、特定の文字を探す場合
例えば • [データ構造] リスト • [アルゴリズム] ループ PHPの文字列リストから、特定の文字を探す場合 O(N)
例えば • [データ構造] リスト • [アルゴリズム] Binary Search 整列されたデータであった場合
例えば • [データ構造] リスト • [アルゴリズム] Binary Search 整列されたデータであった場合 O(LogN)
計算量のおさらい https://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量/
計算量 整列されてないデータ 整列されているデータ O(N) 単純ループ O(logN) Binary Search
アルゴリズム単体での限界 この先はデータ構造の助けがいる
例えば PHPでのよくある解決策としては 配列の値をhashのキーに置き換える
例えば • [データ構造] HashMap • [アルゴリズム] キーの存在チェック
例えば • [データ構造] HashMap • [アルゴリズム] キーの存在チェック O(1)
計算量のおさらい https://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量/
ここまでのまとめ
アルゴリズムだけでは、限界があるの でデータ構造を工夫する必要がある
つまり、データ構造は向いているアル ゴリズムがある
C言語とか書いてた人は そりゃデータ構造いるだろ? 何いってんだ?となる
ここからB木の話
B木 1972年にBayerとMcCreightが発表した 論文 ORGANIZATION AND MAINTENANCE OF LARGE ORDERED INDICES
Boeing Research Labs に所属していた
B木の特徴 データアクセスを最小限にしつつ、データを効率的に保 存するためのデータ構造として生み出された。
B木の特徴 平衡木という特徴がある 二分木の場合 -> 偏った木になる可能性がある
偏った木
偏った木 ルートから3回の値比較が必要
平衡木
平衡木 全体の深さが同じになる
B木は挿入、削除で木の調整を行う
全体として バランスの取れた状態になる
ここでピンと来るかもしれない
B木は挿入、削除で木の調整を行う
データベースのインデックス追加時のコスト 平衡木はデータ追加時に木に調整が必要
5を加えたらどうなる?
これは平衡でない
高さが一定になるように調整される この”調整”がいわゆるコスト
このコストはどれくらいなのか?
5を加えることを考える
1. 挿入箇所を探す ルートからキーを比較して挿入箇所のノードを探す
2. 挿入処理を行う 探した挿入箇所にノードを追加する
3. ノード数が次数に達したら上にマージ 3,4,5で分裂した木をルートに向けてマージする
3. ノード数が次数に達したら上にマージ もし、ここも満杯になったら同じ処理を上に向かって繰り返す
O(logN) で探す + O(logN) でマージ
2 x O(logN) の計算量で インデックスの再構築が行われる
基本的にはデータを挿入するノードに 至るまでの経路上のノードに対して再 帰的に処理を行えば平衡が保たれる
経路外のノードは調整しない そこまで仕様は複雑じゃない
B木の特徴 また、もう一つの大きな特徴として 外部メモリ使用時の有用性
最近はインメモリデータベースなども ありますが、一般的にはデータベース はストレージ(HDD, SSD) にデータを 保存
OSのシステムコールはブロック単位で データの読み書きを行う 通常は4096バイト
必要なデータが1バイトだったとして も4096バイトの読み込み
昔のHDD ぐるぐる回るシリンダー から、データを読み取る ため、ブロック効率が良 くないともったいない! SSDで読み取りが早く なったとはいえ、無駄の ないデータIOはデータ ベースの鍵
B木はノードのサイズを設計可能 例えば 4バイト整数のキーで、ノード のインデックスも4バイトの場合
(4+4) x 2B = 8 x 512 = 4096 バイト
このように外部メモリに対してあらか じめデータ量を計算できる
なんでB木はデータベースインデック スで使われるの?
因果関係が逆
Randomに配置された大量の書類のイ ンデックスを効率的に管理するために 作られたのがB木
実際のB木の動き(デモ)
B+木 B木の特徴を保持しつつ、実用的な機能性を付加 論文 The Ubiquitous B-Tree
データ構造のイメージ
B+木 平衡を保つ基本的な仕組みはB木と同じ ただし、リーフノードにすべてのデータを保持
データ構造のイメージ リーフにすべてのデータが並ぶ
木の高さが変わってもリーフにすべてのデータが並ぶ
B+木の検索 3を探す場合は近傍のノードから到達
リーフがポインターを数珠つなぎにもつため 範囲検索も可能
検索 始点・終点でリーフだけで範囲を取得できる
カバリングインデックス(おまけ) インデックスのデータのみを取得する場合
カバリングインデックス(おまけ) インデックス検索以後の処理が必要ない
本当は実装が完了したリポジトリリンクを バシッと貼りたかったが 未完...orz 口でいうほど全然簡単じゃなかった
まとめ
データベースのインデックスが速いのは インデックスのデータ構造が専用につくら れているから
古典 インデックスサイズの正確な計算を実感するにはやはりC
安定のラムダノート この本には何度も命を救われている