SQLite最強説を本番運用で1年間検証した結果を全部晒す

$ |
SQLite最強説を本番運用で1年間検証した結果を全部晒す
$

SQLite本番運用、やってみた

「SQLiteは開発用でしょ?本番にはPostgreSQLかMySQL使うでしょ?」——この常識、実は2026年にはもう通用しない。僕は実際に月間50万PVのWebサービスでSQLiteを1年間本番運用した。その全記録を晒す。

SQLiteが本番で使える理由

SQLiteの進化を舐めてはいけない。WALモード(Write-Ahead Logging)の導入で、読み取りの並行性が劇的に向上した。

-- WALモードを有効化
PRAGMA journal_mode=WAL;
-- 推奨設定
PRAGMA busy_timeout=5000;
PRAGMA synchronous=NORMAL;
PRAGMA cache_size=-64000;  -- 64MB
PRAGMA foreign_keys=ON;

この設定で、読み取りは完全に並行実行される。書き込みもWALのおかげで読み取りをブロックしない。ほとんどのWebアプリは「読み取り多数・書き込み少数」だから、これで十分。

1年間の運用データ

月間50万PV、DBサイズ約2GB、テーブル数35。サーバーはHetznerの月額€7のVPS。これで平均レスポンスタイム12ms。PostgreSQLで同じアプリを動かしたら45msだった。ネットワークラウンドトリップがないSQLiteの強み。

障害件数:ゼロ。バックアップはLitestreamで S3にリアルタイムレプリケーション。復旧テストも問題なし。

SQLiteの限界が見えた瞬間

書き込みが多いバッチ処理で限界が見えた。1秒間に500以上のINSERTが必要な場面では、WALでも書き込みロックが発生する。あとマルチサーバー構成は基本無理。水平スケーリングしたい場合はPostgreSQLに移行するしかない。

SQLiteを選ぶべき場面

シングルサーバーで完結するサービス、読み取り中心のアプリ、個人開発やスタートアップ初期。これらならSQLite最強は揺るがない。運用コストの低さ(DBサーバー不要、コネクションプーリング不要)は経営的にもデカい。「とりあえずPostgreSQL」の思考停止、そろそろ見直した方がいい。