SQLiteインデックスの可視化: 構造
- インデックスの重要性: SQLiteはブラウザ、モバイルアプリ、オペレーティングシステムで広く使われているDBMSであり、インデックス構造を理解し、ディスクとメモリでの保存方式を探るのに適している。
ノードとページ構造
- B木構造: SQLiteのインデックスはB木構造で保存され、各ノードは複数の子を持つ。
- ページとセル: ページはセルデータを保存し、右側の子ページへのリンクを持つ。セルはインデックスデータ、rowId、左側の子ページへのリンクを含む。
SQLiteソースコード分析
- コード例: インデックス分析のための関数を作成する。たとえば、
sqlite3DebugBtreeIndexDump 関数は選択したインデックスの内容を読み取って出力する。
- Dockerの使用: Dockerを使ってインデックスダンプをテストできる。
インデックスの可視化
- 可視化ツール: d3-org-treeライブラリを使ってインデックス構造を可視化しようとしたが、テキストで構造を表示するほうがより簡単だった。
- PHP ImageMagick: PHPのImageMagick拡張を使って、デザインや間隔を制御できる画像を生成する。
さまざまなインデックスの例
- 基本インデックス: 1件のレコードで構成されたシンプルなインデックス。
- さまざまなレコード数: 1,000件および1,000,000件のレコードを持つインデックス。
- ソート方向の比較: ASCとDESCのソート方向を持つインデックスの比較。
- 式ベースのデータ: 式を使ってインデックスを作成する。
- NULL値を含む一意インデックス: SQLiteはNULL値を持つ一意インデックスをサポートする。
- 部分インデックス: NULL値をフィルタリングしてインデックスを作成する。
- 複数列インデックス: 複数の列を含むインデックスを作成する。
インデックス最適化
- VACUUMおよびREINDEX: 既存のインデックスを最適化するために使われるコマンド。
- テキストデータ: 短い文字列はインデックスセルに直接保存され、長いテキストは別途保存される。
- 浮動小数点データ: 浮動小数点データを含むインデックスを作成する。
結論
- インデックス構造の理解: SQLiteのインデックス構造と、B木におけるデータ保存およびアクセス方式を理解する。
- 可視化の重要性: 可視化を通じて、さまざまなインデックスを分析し比較できた。
- 今後の計画: インデックスベースの検索の可視化と、興味深いSQLクエリの探究を予定している。
1件のコメント
Hacker Newsのコメント
SQLiteテーブルの各行は基本的に一意なrowIdを持ち、これは明示的に定義されていない場合は主キーのように機能する
データベース管理システム(DBMS)がディスクとメモリ上でインデックスを保存し検索する方法を見てみたかった
ウェブサイトがとても読みやすいので読みたい
"indexes" は動詞 "to index" の三人称単数現在形としても、名詞 "index" の複数形としても使われる
PostgreSQLが同じ作業をどのように行うのかを見て、比較し、メモを残すのもよさそう
yEd向けのtgfを生成すれば、より少ない手間でより多様なレイアウトを得られる