SQLite本番運用で学んだ実践的知見

原題: Learning a few things about running SQLite

なぜ重要か

小規模サービスでのSQLite本番採用が増える中、運用上のリスクと対策を具体的数値とともに示した実践的事例として参照価値が高い。

エンジニアのJulia Evansが、DjangoサイトでSQLiteをデータベースとして本番運用する中で得た知見をブログに公開した。ANALYZEコマンドの重要性、大量削除時のロック競合問題、バックアップ方法など、小規模サイト向けSQLite運用の具体的な注意点を2026年7月17日に公開した。

Julia Evansは、Djangoサイト構築にあたりSQLiteをデータベースとして採用し、運用中に直面した課題と学びをブログ記事にまとめた。今回のサイトはSQLite採用4例目にあたるが、Django ORMの活用によりデータベースへの負荷が以前より増したと説明している。

最大の発見は「ANALYZE」コマンドの重要性だ。FTS5(全文検索)を使ったクエリが4,000行のテーブルに対して5秒かかるという問題が発生した。ANALYZEを実行したところ、同クエリが約0.05秒以下まで短縮された。ANALYZEはテーブルの行数など統計情報を生成し、クエリプランナーが最適な実行計画を選択できるようにする。

次に、大量行の削除処理における排他ロック問題が挙げられた。不要な行をまとめて削除しようとすると処理が5秒以上かかり、他のワーカーが同時書き込みを試みてタイムアウト(上限5秒)が発生。ワーカーがクラッシュしてVMがシャットダウンするという事態を複数回経験した。現状は小さなバッチに分けて削除することで対応しているが、この経験から複数ライターを同時にサポートするPostgresのような「本格的な」データベースへの理解が深まったとも述べている。

ORM経由のクエリパフォーマンスについては、データベースが約1万行と小規模であるため現時点では大きな問題は出ていない。バックアップについては、`VACUUM INTO`でダンプしてgzip圧縮後にS3へアップロードする方法と、resticを使う方法の2通りを採用。復元テストは未実施だが、デッドマンスイッチによる監視を実施していると説明した。

出典

jvns.ca — 元記事を読む →