2.

SQLite (.sqlite / .sqlite3 / .db) とは|組み込み RDBMS の定番

編集
この記事の要点
  • SQLite は D. Richard Hipp 氏が 2000 年に公開した、世界で最も使われている組み込み RDBMS。Public Domain(実質)で誰でも自由に使える
  • 1 つの DB が 1 ファイル に収まる。拡張子は .sqlite / .sqlite3 / .db など慣習でバラバラだが中身は同じバイナリ形式
  • サーバプロセスを持たず、アプリにライブラリとしてリンクされる。ローカルアプリ・スマホアプリ・テスト用 DB の定番
  • ファイル先頭 16 バイトのマジック「53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00」(SQLite format 3\0) で識別可能
  • 同時書き込みは 1 プロセスのみ(ファイルロック)。読み込みは並行可能。高並行性が必要な Web 用途には不向き
  • WAL(Write-Ahead Logging)モードで書き込みと読み込みの競合を緩和できる。PRAGMA journal_mode=WAL; で有効化
  • 機能は本格的:トランザクション・外部キー・JSON 関数・全文検索(FTS5)・R-tree・ウィンドウ関数まで揃う

概要

SQLite(読み: エスキューライト)は、D. Richard Hipp 氏が 2000 年 8 月に公開した、サーバプロセスを持たない組み込み型のリレーショナルデータベースです。ソースコードは Public Domain(厳密にはパブリックドメイン宣言、補助的に Blessing ライセンス)で公開されており、商用利用も無制限。iPhone・Android の設定 DB、Chrome のブックマーク、Firefox の履歴、macOS の Core Data、Python の標準ライブラリ、Adobe Lightroom のカタログ など、デスクトップ・モバイル・組み込みのありとあらゆる場所で動作しており、地球上で最も配備されている DBMS と公式に表現されます。

SQLite の DB は 1 つのファイル にすべてが収まる点が最大の特徴です。スキーマ・データ・インデックス・トリガまで全部 1 ファイル。コピーすればまるごとバックアップ、削除すればまるごと破棄、というシンプルな運用ができます。拡張子は .sqlite.sqlite3.db.db3 など 慣習で複数 あり、どれもファイル形式としては同じ SQLite 3 形式 です(SQLite 2 とはバイナリ非互換)。

サーバが要らないため 導入コストがゼロsqlite3 CLI で sqlite3 my.db と叩けばその場で DB が作られ、CREATE TABLE / INSERT / SELECT がそのまま使えます。アプリ側ではほとんどの言語に SQLite バインディングがあり、Python なら sqlite3 モジュールが標準ライブラリ、Node.js なら better-sqlite3、Go なら mattn/go-sqlite3、PHP なら PDO のドライバが利用できます。

内部構造とファイル形式

SQLite のファイルは 固定 100 バイトのヘッダ + 可変長のページ列 という構造です。ヘッダの先頭 16 バイトはマジックナンバー 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00(ASCII で SQLite format 3 + ヌル終端)で、これを見ればファイルが SQLite 3 形式と判定できます。

オフセット長さ内容
016マジック SQLite format 3\\0
162ページサイズ(512〜65536、デフォルト 4096)
181ファイル書式バージョン
244ファイル変更カウンタ
284DB のページ数
964SQLite バージョン番号

データはページ単位で B-Tree に格納されます。各テーブルとインデックスがそれぞれ B-Tree のルートを持ち、sqlite_master(または sqlite_schema)という特殊テーブルに全スキーマが SQL 文の形で保存されています。sqlite3 で開いて SELECT sql FROM sqlite_master; と打てば、その DB のスキーマ全文が読み出せます。

同時書き込みはデフォルトでファイルロック方式のため 1 プロセス 1 ライタ。読み込みは複数同時に可能です。WAL モード(Write-Ahead Logging)に切り替えると、書き込みは別ファイル *.db-wal に追記され、読み込みは元ファイルから継続できるため、読み書きの競合が大幅に減ります。Web アプリ的に複数リクエストが並ぶ用途では WAL が事実上必須です。

主な用途

  • モバイルアプリのローカル DB: iOS の Core Data、Android の Room はいずれもバックエンドが SQLite
  • デスクトップアプリの設定 / カタログ: Lightroom のカタログ、Notion のローカルキャッシュ、Slack のローカル DM 履歴
  • ブラウザの内部 DB: Chrome の Cookie・履歴・パスワードはすべて SQLite ファイル
  • テスト用 DB: ユニットテストでメモリ上 SQLite(:memory:)を使うと、本物の DB セットアップ不要で高速に SQL を検証できる
  • データ配布フォーマット: 公開データセット(地理データ・辞書データ)を SQLite で配ると、受け取った側がそのまま SQL を打てる
  • 小〜中規模 Web サイト: 同時書き込みが少ない読み取り中心のサイトなら、WAL モードで十分実用になる

関連形式との比較

項目SQLiteMySQL / PostgreSQLDuckDB
形態組み込み・1 ファイルサーバ常駐組み込み・1 ファイル
得意領域OLTP(小規模)・組み込みOLTP(大規模・高並行)OLAP(列指向・分析)
並行書き込み1 ライタ(WAL で改善)マルチライタ1 ライタ
典型データ量〜数 GB数 TB〜数百 GB〜
ライセンスPublic DomainGPL / PostgreSQL ライセンスMIT

SQLite と同じ「組み込み 1 ファイル DB」の系譜で、分析用途に特化したのが DuckDB です。SQLite が 行指向の OLTP、DuckDB が 列指向の OLAP という棲み分けで、最近では両方を併用する事例が増えています。

コマンド・ツール

# DB 作成(ファイルがなければ作られる)
sqlite3 shop.db

# CLI 内で
sqlite> .databases             -- 開いている DB
sqlite> .tables                -- テーブル一覧
sqlite> .schema users          -- 特定テーブルの DDL
sqlite> .mode column           -- 結果を列整形
sqlite> .headers on            -- ヘッダ表示
sqlite> PRAGMA journal_mode=WAL;  -- WAL 有効化
sqlite> PRAGMA foreign_keys=ON;   -- 外部キー有効化(デフォルト OFF)

# テキストダンプ
sqlite3 shop.db ".dump" > shop.sql

# CSV 取り込み
sqlite3 shop.db ".mode csv" ".import data.csv users"

# ファイルの種別を確認(マジック)
file shop.db
# => shop.db: SQLite 3.x database

GUI クライアントは DB Browser for SQLite(無料 / クロスプラットフォーム)が定番。商用では DBeaverTablePlusJetBrains DataGrip がよく使われます。

注意点

  • 外部キーはデフォルト OFF: PRAGMA foreign_keys=ON; を接続ごとに打たないと参照整合性が効かない。接続文字列で強制するライブラリも多い
  • 動的型付け: SQLite は型を緩く扱う「型親和性」方式で、INTEGER 列に文字列を入れることもできてしまう。アプリ側で CHECK 制約を入れて防ぐ
  • 大量並行書き込みには弱い: Web の本格運用には MySQL / PostgreSQL を推奨。SQLite を Web で使うなら WAL モード必須、それでも書き込みが秒間数百を超えたら別 DB を検討
  • WAL モードのファイル増殖: *.db-wal*.db-shm が同時に生成される。バックアップ時はこれら 3 つを一緒にコピーするか、VACUUM でチェックポイントを切ってから単体コピーする
  • ネットワーク越し利用は厳禁: NFS / SMB 越しの SQLite は ファイルロックがバグる ことで有名で、DB 破損の原因になる。SQLite は同一ホスト前提
  • 大きな BLOB: 1 行に数 MB の BLOB を入れると性能劣化が目立つ。ファイルは別管理にしてパスだけ DB に持つのが定石

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SQL ダンプ(.sql)
  2. SQLite(.sqlite / .sqlite3 / .db)
  3. Parquet(.parquet)
  4. Avro(.avro)
  5. ORC(.orc)
  6. NDJSON / JSONL(.ndjson / .jsonl)
  7. BSON(.bson)
  8. Protocol Buffers(.proto)
  9. Feather / Arrow IPC(.feather / .ipc / .arrow)
  10. DB ダンプ(.dump / .bak)

最近更新/作成されたページ