sqlite3的生产环境性能优化

Posted by backup@lfo.cc; tagged with none

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
        'OPTIONS': {
            # 使用分号分隔的多条 PRAGMA 语句
            'init_command': (
                "PRAGMA journal_mode = WAL;"      # 最重要:开启写前日志,提升并发
                "PRAGMA synchronous = NORMAL;"    # 安全与性能平衡,机械硬盘推荐
                "PRAGMA cache_size = -524288;"    # 512MB 页面缓存(足够覆盖你的 20MB 数据库)
                "PRAGMA temp_store = MEMORY;"     # 临时表放内存,加速复杂查询
                "PRAGMA foreign_keys = ON;"       # 强制开启外键(Django 默认已开,这里显式保险)
            ),
        },
        'TIMEOUT': 30,              # Django 5.x 推荐写法(等同于之前的 'timeout')
        'CONN_MAX_AGE': 600,        # 持久连接 10 分钟,极大减少机械硬盘的打开/关闭开销
        'CONN_HEALTH_CHECKS': True, # Django 3.2+ 新特性,自动检测并清理坏连接
        # Django 5.0+ 新增选项,建议开启以获得更好 WAL 模式支持
        'ATOMIC_REQUESTS': False,   # 如果你不需要每个请求都原子事务,可设 False 进一步提升性能
    }
}