2025/09/04 21:36 SQLite's File Format

やっほー、ロボ子!今日はSQLiteのデータベースファイル構造について解説するのじゃ!

博士、こんにちは!SQLiteのファイル構造、興味深いです。ぜひ教えてください。

SQLiteデータベースは、基本的に一つのファイルに全部入ってるんだぞ。でも、トランザクション中は「ロールバックジャーナル」とか「WAL」っていう追加ファイルを使うこともあるのじゃ。

ロールバックジャーナルとWALは、データベースを整合性のある状態に戻すために使うんですね。

その通り!もし途中でクラッシュしても、これらのファイルがあれば安心なのじゃ。で、データベースファイルは「ページ」っていう単位で区切られてるんだぞ。ページサイズは512バイトから65536バイトまで、2の累乗で選べるのじゃ。

ページサイズはデータベース作成時に決まるんですか?

そう、一度決めると変えられないぞ。そして、各ページには1から始まる番号が振られていて、最大で約281テラバイトまで扱えるのじゃ!

281テラバイト!すごいですね。でも、そんな大きなデータベースを扱うことって、実際にあるんですか?

理論上は可能ってことじゃ。実際には、そこまで巨大なSQLiteデータベースは稀じゃろうな。で、ファイルの最初の100バイトは「データベースヘッダー」っていう特別な場所なのじゃ。

データベースヘッダーには、どんな情報が入っているんですか?

ページサイズとか、ファイル形式のバージョン番号とか、データベースのサイズとか、重要な情報が色々入ってるのじゃ。例えば、最初の16バイトには「SQLite format 3」っていうマジックナンバーが入ってて、これがSQLiteのファイルだってことを示してるんだぞ。

マジックナンバー!面白いですね。それから、ファイル変更カウンターっていうのもあるんですね。これは何に使うんですか?

データベースが変更されるたびに増えるカウンターで、ファイルの整合性をチェックするのに役立つんだぞ。他にも、スキーマCookieとか、推奨キャッシュサイズとか、色々な設定が詰まってるのじゃ。

スキーマCookieは、データベーススキーマが変更されるたびにインクリメントされるんですね。

その通り!データベースの構造が変わったことを検知できるのじゃ。そして、データベースの中身は「B-tree」っていう構造で管理されてるんだぞ。B-treeは、データを効率的に検索するための仕組みじゃ。

B-treeは、データベースのインデックスにも使われる技術ですよね。

さすがロボ子、よく知ってるのじゃ!B-treeのおかげで、大量のデータからでも目的の情報を素早く見つけられるんだぞ。もしペイロードが大きすぎたら、「セルペイロードオーバーフローページ」っていうのを使うのじゃ。

オーバーフローページ、名前の通りですね。

そして、「ポインタマップ」っていう特別なページもあるのじゃ。これは、auto_vacuumとかincremental_vacuumっていうモードで、データベースを整理整頓するために使うんだぞ。

データベースのメンテナンスにも、色々な工夫がされているんですね。

そういうことじゃ。SQLiteは、見た目はシンプルだけど、中身は奥深い技術で支えられているんだぞ!

今日はSQLiteのファイル構造について、とてもよく理解できました。ありがとうございます、博士!

どういたしまして。最後に一つ、SQLiteのデータベースファイルは、拡張子が「.db」とか「.sqlite」とか、色々あるけど、中身は全部同じ構造なのじゃ。拡張子で判断しちゃダメだぞ!

なるほど、拡張子詐欺ですね!

そういうこと!…って、ロボ子もしかして、おやじギャグに目覚めたのじゃ…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。