概要
- Djangoサイトで SQLite を運用した経験の共有
- ANALYZEコマンド の重要性とパフォーマンス改善
- データベースのクリーンアップや バックアップ 手法の紹介
- ORMクエリや複数DB運用の実践例
- 小規模サイトでのSQLiteの利便性と今後の課題
DjangoサイトでのSQLite運用メモ
- SQLite を本番運用する小規模サイトでの実体験
- Django ORMの活用でデータベースの負荷増加
- WALモード (Write-Ahead Logging)を有効化し、パフォーマンス向上を図る手法
- SQLiteも他のDB同様に 運用知識 が必要である実感
ANALYZEコマンドの重要性
- FTS5による全文検索クエリが 4000行で5秒 もかかる事象
- ANALYZEコマンド 実行でクエリが0.05秒に短縮
- ANALYZEはテーブル行数などの 統計情報 を生成し、クエリプランナーの最適化に寄与
- クエリプランの理解や調整の必要性を実感
データベースのクリーンアップ
- 不要な行(例:django-tasks-dbの完了タスク)の削除作業
- DELETE文 の遅さや、トランザクション中のPythonコードの影響を疑問視
- クリーンアップ中に他ワーカーの書き込みがタイムアウトし クラッシュ する問題
- 現状は 小さなバッチ での削除実行で対応
- 本格的なDB運用では Postgres など複数書き込み対応DBの利便性を再認識
- 今後は メンテナンスモード の検討も課題
Django ORMクエリのパフォーマンス
- ORMのパフォーマンスを特に意識せず運用
- データ量が 1万行程度 であれば大きな問題なし
- 今後も小規模なら現状維持方針
SQLiteのバックアップ手法
- restic を使ったバックアップ
VACUUM INTOでDBファイルを抽出、gzip圧縮、S3にアップロード- OOMでロックが残る場合は
restic unlockで解除 - 定期的なバックアップ・スナップショット・古いバックアップの削除運用
- Litestream による増分バックアップ
- 設定ファイルでAWS S3へレプリケーション
retention: 400hで履歴保持を試行- AWS認証情報の管理が手間
- S3互換サービスへの移行検討も視野
複数データベース運用の工夫
- プロジェクトによって DBファイルを分割 して運用
- Mess with DNSでは3つのDBファイルに分割し、運用効率化
- 2022年からSQLite運用を継続し、 Postgresからの移行 が正解だったと実感
学びと今後の課題
- 基本的なSQLite運用ノウハウの習得に 時間がかかった 体験
- 今後も新しい機能や運用テクニックを 継続的に学習 予定
参考資料
- The definitive guide to using Django with SQLite in production
- A gist on sqlite performance tuning
- SQLite公式ドキュメント