概要
- SQLite は従来「ローカル専用」と見なされがちだったが、その神話は現代のインフラで再考が必要
- WALモード やメモリ最適化により、サーバー用途でも高い性能と同時接続性を実現可能
- 適切な チューニング とVFS活用で耐障害性・スケーラビリティも担保
- クラウド環境 やエッジでの単一テナント運用に特に有効
- 大規模分散書き込みや巨大データセットにはPostgreSQL等が依然有利
SQLite「ローカル専用」神話の再検証
- SQLite は従来、モバイルやIoT、開発用途の組み込みDBとして利用されてきた歴史
- 本番運用には PostgreSQL や MySQL などクライアントサーバー型DBが「必須」という常識
- しかし、 NVMe SSD や超高速ストレージの普及、エッジ単一テナント化により、DBのネットワーク遅延が主なボトルネックに
- アプリケーションプロセス内で SQLite を直接動かせば、ネットワークオーバーヘッドがゼロ
- 読み込みは単なるメモリマップドファイル操作となり、サブミリ秒の高速応答を実現
- 本番運用には WALモード、ロック制御、キャッシュ管理、カスタムVFSなどの深い理解とチューニングが不可欠
Write-Ahead Logging(WAL)モードの詳細
- デフォルトの ロールバックジャーナル 方式では、書き込み時に元のページを別ファイルに保存
- トランザクション成功時に削除、失敗時に復元
- この方式は 同時実行性が低く、書き込み中は読み取りもブロックされる
- WALモード では、書き込みは.sqlite-walファイルに追記され、読み取りと書き込みが非ブロッキングに
- 読み取りはメインDBファイル+WALファイルから最新ページを参照
- 書き込みはWAL末尾への追記のみ
チェックポイント処理
- WALファイルは肥大化するため、定期的にメインDBへ統合する「 チェックポイント」が必要
- チェックポイントモードは4種類
- PASSIVE :読者・書き手をブロックせず、可能な範囲で統合
- FULL :新規書き込みをブロックし、全読者終了後に全統合
- RESTART :FULLに加え、WALサイズをゼロにリセット
- TRUNCATE :RESTARTに加え、WALファイル自体をゼロバイトに
- 高頻度書き込みサーバーでは、 バックグラウンドで明示的にチェックポイント を実施推奨
- 例:
PRAGMA wal_checkpoint(PASSIVE);
- 例:
- ディスク同期のボトルネック回避には
PRAGMA synchronous = NORMAL;を併用- NORMALモードはチェックポイント等の重要時のみディスク同期
- WALモードならこの設定でもDB破損リスクなし
同時実行アーキテクチャとSQLITE_BUSY対策
- WALモード でも書き込みは「単一トランザクションのみ許可」
- 複数接続が同時書き込み要求すると SQLITE_BUSY エラー発生
- 接続プール やトランザクション設計でこの制約への対策が必須
1. ビジータイムアウト設定
PRAGMA busy_timeout = 5000;などでロック取得リトライ時間を指定- SQLiteが内部で指数バックオフしつつ5秒間リトライ
- 高負荷時のアプリ側エラー大幅減
2. トランザクションモードとロック制御
- DEFERRED (デフォルト):最初はロック取得せず、書き込み時に昇格。デッドロックリスクあり
- IMMEDIATE :開始時に予約ロック取得。他接続はIMMEDIATE/EXCLUSIVE不可(読み取りは可)。デッドロック回避
- EXCLUSIVE :完全排他ロック取得。全読み書きをブロック
- 書き込みトランザクションは常にBEGIN IMMEDIATE推奨
- 例:
BEGIN IMMEDIATE; ... COMMIT;
- 例:
メモリ・キャッシュ最適化
- デフォルトのキャッシュサイズは 2MB程度 と小さい
- ワークセットに合わせて キャッシュサイズを拡張 することでディスクI/O削減
- 例:
PRAGMA cache_size = -64000;(約64MB割当て)
- 例:
メモリマップドI/O(mmap)
- SQLiteは
mmapでDBファイルを仮想アドレス空間に直接マッピング可能- OSカーネルがページキャッシュ管理を担当し、高速読み取りを実現
- 例:
PRAGMA mmap_size = 2147483648;(2GBまでマッピング)
クラウド時代のCustom VFS活用
- VFS(Virtual File System) はSQLiteの全ファイル操作を抽象化
- OSファイルシステム以外への書き込みも可能
- 代表的なVFSベースレプリケーション
- Litestream :WALフレームをオブジェクトストレージ(例:AWS S3)へストリーミングし、ポイントインタイムリカバリを実現
- LiteFS :FUSEベースVFSでSQLiteをクラスタ複製し、リアルタイム同期・分散リードレプリカを実現
- クラウド環境や一時的なローカルディスク では、VFSベースのレプリケーションツール利用が高可用性・耐障害性の鍵
本番運用向けSQLite設定ブループリント
- アプリ起動時、各DB接続直後に下記PRAGMAを実行推奨
PRAGMA journal_mode = WAL;-- WALモード有効化PRAGMA synchronous = NORMAL;-- 同期オーバーヘッド削減PRAGMA busy_timeout = 5000;-- ビジータイムアウト設定PRAGMA cache_size = -64000;-- キャッシュ64MB割当てPRAGMA mmap_size = 1073741824;-- 1GBメモリマップ有効化PRAGMA foreign_keys = ON;-- 外部キー制約有効化PRAGMA journal_size_limit = 67108864;-- WALファイル64MB制限PRAGMA auto_vacuum = INCREMENTAL;-- インデックス・クエリプラン最適化
結論:SQLite本番運用の判断基準
- WALモード ・ メモリマップ ・ 適切なトランザクション設計 により、1台のSQLiteで数百同時接続・数百万クエリ/日も可能
- 複雑な分散書き込み や 数TB超の巨大データ にはPostgreSQL等が適切
- リード中心・数百GB規模・超低遅延重視 なら、アプリサーバー直上SQLite運用は高性能・運用シンプル・低コストな選択肢
#SQLite #Database Engineering #Performance Tuning #Backend Architecture #Systems Programming