你在settings.py里写的那行ENGINE决定了 Django 怎么跟数据库说话。选错了轻则报错重则拖垮整个服务。一、ENGINE 到底是什么DATABASES配置里的ENGINE本质上是一个Python 模块路径指向 Django 的数据库后端实现。DATABASES{default:{ENGINE:django.db.backends.mysql,# ← 就这一行决定了一切NAME:mydb,...}}Django 启动时会根据这个路径import对应的模块然后用它来建立连接发送 SQL处理事务管理连接生命周期不同的 ENGINE 不同的驱动 不同的连接策略 不同的性能表现。二、MySQL 的三种 ENGINE差别巨大这是最容易踩坑的地方。MySQL 光 ENGINE 就有三种可选ENGINE底层驱动连接池性能推荐度django.db.backends.mysqlmysqlclientC 扩展❌ 无⭐⭐⭐⭐⭐开发 / 低并发dj_db_conn_pool.backends.mysqlmysqlclient DBUtils✅ 有⭐⭐⭐⭐⭐生产首选✅mysql.connector.djangomysql-connector-python纯 Python❌ 无⭐⭐⭐兼容优先2.1django.db.backends.mysql— Django 亲生的Django 自带不用装任何额外包。底层用的是mysqlclient这是一个C 扩展性能最好。但它没有连接池。每次请求来了开连接 → 查数据 → 关连接。请求走了连接就断了。请求1 → 开连接 → 查询 → 关连接 请求2 → 开连接 → 查询 → 关连接 请求3 → 开连接 → 查询 → 关连接QPS 低的时候没问题。QPS 一上来光是建连接的开销就能把 MySQL 拖慢。⚠️ 你配置里写了POOL_OPTIONS但这个 ENGINE完全不认识等于白写。2.2dj_db_conn_pool.backends.mysql— 带连接池的第三方包dj-database-url生态里的dj-db-conn-pool。底层还是mysqlclient但外面包了一层DBUtils.PersistentDB连接池。请求1 → 从池里拿连接 → 查询 → 还回池里 请求2 → 从池里拿连接 → 查询 → 还回池里 请求3 → 从池里拿连接 → 查询 → 还回池里你配置里的POOL_OPTIONS就是给它用的参数含义你的配置说明POOL_SIZE池里最多放几个连接10够用别设太大MAX_OVERFLOW池满了还能额外创建几个5突发流量的缓冲RECYCLE连接存活多久后强制重建3600 秒必须 MySQL 的wait_timeoutTIMEOUT池满了等多久超时报错30 秒合理✅生产环境用这个你的POOL_OPTIONS才能真正生效。安装pipinstalldj-database-url dj-db-conn-pool2.3mysql.connector.django— MySQL 官方出的MySQL 官方团队维护的 Django 后端。底层用mysql-connector-python纯 Python 实现不依赖 C 扩展。优点缺点不用装系统级 mysqlclient性能比 mysqlclient 慢 20~30%部署简单pip install 就行没有连接池MySQL 8.0 认证插件无缝支持社区生态不如 mysqlclient 成熟什么时候用它服务器装不了 mysqlclient缺少编译环境MySQL 8.0 用了caching_sha2_password认证mysqlclient 版本太老Docker 镜像不想加系统依赖三、不只是 MySQL其他数据库的 ENGINE数据库ENGINE底层驱动备注PostgreSQLdjango.db.backends.postgresqlpsycopg2 / psycopg3✅ 生产首选 psycopg3SQLitedjango.db.backends.sqlite3Python 内置开发 / 测试用Oracledjango.db.backends.oraclecx_Oracle企业级配置复杂SQL Servermssql-djangopyodbcWindows 生态PostgreSQL 特别说一下Django 4.2 推荐用psycopg3ENGINE:django.db.backends.postgresql,OPTIONS:{options:-c search_pathpublic,},如果要连接池PostgreSQL 的选择更多方案ENGINE说明无池django.db.backends.postgresql够用连接池dj_db_conn_pool.backends.postgresql和 MySQL 那个同一个包专业级用 PgBouncer外部代理超大并发才需要四、怎么选一张决策表你的场景MySQL ENGINEPostgreSQL ENGINE开发 / 测试django.db.backends.mysqldjango.db.backends.postgresql生产QPS 50django.db.backends.mysqldjango.db.backends.postgresql生产QPS 50dj_db_conn_pool.backends.mysql✅dj_db_conn_pool.backends.postgresql装不了 C 扩展mysql.connector.djangodjango.db.backends.postgresqlpsycopg3 是纯 PythonMySQL 8.0 认证报错mysql.connector.django—超大并发QPS 1000外部 ProxySQL外部 PgBouncer五、常见坑坑1POOL_OPTIONS 写了但不生效用了django.db.backends.mysql却写了POOL_OPTIONS。这个 ENGINE 不认识这些参数Django 启动不会报错但也不会生效。等于你精心调了一堆参数全白费。坑2RECYCLE MySQL wait_timeout你设了RECYCLE: 3600但 MySQL 的wait_timeout默认是 288008 小时看起来没问题。但如果运维改了 MySQL 配置wait_timeout变成 180030 分钟你的连接池还在用 3600 秒前的连接直接报MySQL server has gone away。铁律RECYCLE必须小于MySQL 的wait_timeout建议设成它的 1/2。坑3SQLite 用在生产django.db.backends.sqlite3是文件数据库并发写会锁整个文件。开发可以生产别用。真要省成本用 PostgreSQL别用 SQLite。六、总结优先级动作1生产环境 MySQL → 换成dj_db_conn_pool.backends.mysql2你的POOL_OPTIONS配置是对的但要配对 ENGINE 才生效3RECYCLE查一下 MySQL 的wait_timeout确保 RECYCLE wait_timeout4PostgreSQL 优先用psycopg35别在生产用 SQLite那行 ENGINE值得你花 5 分钟认真选一次。
Django 数据库 ENGINE 完全指南:选错了,性能差 10 倍
你在settings.py里写的那行ENGINE决定了 Django 怎么跟数据库说话。选错了轻则报错重则拖垮整个服务。一、ENGINE 到底是什么DATABASES配置里的ENGINE本质上是一个Python 模块路径指向 Django 的数据库后端实现。DATABASES{default:{ENGINE:django.db.backends.mysql,# ← 就这一行决定了一切NAME:mydb,...}}Django 启动时会根据这个路径import对应的模块然后用它来建立连接发送 SQL处理事务管理连接生命周期不同的 ENGINE 不同的驱动 不同的连接策略 不同的性能表现。二、MySQL 的三种 ENGINE差别巨大这是最容易踩坑的地方。MySQL 光 ENGINE 就有三种可选ENGINE底层驱动连接池性能推荐度django.db.backends.mysqlmysqlclientC 扩展❌ 无⭐⭐⭐⭐⭐开发 / 低并发dj_db_conn_pool.backends.mysqlmysqlclient DBUtils✅ 有⭐⭐⭐⭐⭐生产首选✅mysql.connector.djangomysql-connector-python纯 Python❌ 无⭐⭐⭐兼容优先2.1django.db.backends.mysql— Django 亲生的Django 自带不用装任何额外包。底层用的是mysqlclient这是一个C 扩展性能最好。但它没有连接池。每次请求来了开连接 → 查数据 → 关连接。请求走了连接就断了。请求1 → 开连接 → 查询 → 关连接 请求2 → 开连接 → 查询 → 关连接 请求3 → 开连接 → 查询 → 关连接QPS 低的时候没问题。QPS 一上来光是建连接的开销就能把 MySQL 拖慢。⚠️ 你配置里写了POOL_OPTIONS但这个 ENGINE完全不认识等于白写。2.2dj_db_conn_pool.backends.mysql— 带连接池的第三方包dj-database-url生态里的dj-db-conn-pool。底层还是mysqlclient但外面包了一层DBUtils.PersistentDB连接池。请求1 → 从池里拿连接 → 查询 → 还回池里 请求2 → 从池里拿连接 → 查询 → 还回池里 请求3 → 从池里拿连接 → 查询 → 还回池里你配置里的POOL_OPTIONS就是给它用的参数含义你的配置说明POOL_SIZE池里最多放几个连接10够用别设太大MAX_OVERFLOW池满了还能额外创建几个5突发流量的缓冲RECYCLE连接存活多久后强制重建3600 秒必须 MySQL 的wait_timeoutTIMEOUT池满了等多久超时报错30 秒合理✅生产环境用这个你的POOL_OPTIONS才能真正生效。安装pipinstalldj-database-url dj-db-conn-pool2.3mysql.connector.django— MySQL 官方出的MySQL 官方团队维护的 Django 后端。底层用mysql-connector-python纯 Python 实现不依赖 C 扩展。优点缺点不用装系统级 mysqlclient性能比 mysqlclient 慢 20~30%部署简单pip install 就行没有连接池MySQL 8.0 认证插件无缝支持社区生态不如 mysqlclient 成熟什么时候用它服务器装不了 mysqlclient缺少编译环境MySQL 8.0 用了caching_sha2_password认证mysqlclient 版本太老Docker 镜像不想加系统依赖三、不只是 MySQL其他数据库的 ENGINE数据库ENGINE底层驱动备注PostgreSQLdjango.db.backends.postgresqlpsycopg2 / psycopg3✅ 生产首选 psycopg3SQLitedjango.db.backends.sqlite3Python 内置开发 / 测试用Oracledjango.db.backends.oraclecx_Oracle企业级配置复杂SQL Servermssql-djangopyodbcWindows 生态PostgreSQL 特别说一下Django 4.2 推荐用psycopg3ENGINE:django.db.backends.postgresql,OPTIONS:{options:-c search_pathpublic,},如果要连接池PostgreSQL 的选择更多方案ENGINE说明无池django.db.backends.postgresql够用连接池dj_db_conn_pool.backends.postgresql和 MySQL 那个同一个包专业级用 PgBouncer外部代理超大并发才需要四、怎么选一张决策表你的场景MySQL ENGINEPostgreSQL ENGINE开发 / 测试django.db.backends.mysqldjango.db.backends.postgresql生产QPS 50django.db.backends.mysqldjango.db.backends.postgresql生产QPS 50dj_db_conn_pool.backends.mysql✅dj_db_conn_pool.backends.postgresql装不了 C 扩展mysql.connector.djangodjango.db.backends.postgresqlpsycopg3 是纯 PythonMySQL 8.0 认证报错mysql.connector.django—超大并发QPS 1000外部 ProxySQL外部 PgBouncer五、常见坑坑1POOL_OPTIONS 写了但不生效用了django.db.backends.mysql却写了POOL_OPTIONS。这个 ENGINE 不认识这些参数Django 启动不会报错但也不会生效。等于你精心调了一堆参数全白费。坑2RECYCLE MySQL wait_timeout你设了RECYCLE: 3600但 MySQL 的wait_timeout默认是 288008 小时看起来没问题。但如果运维改了 MySQL 配置wait_timeout变成 180030 分钟你的连接池还在用 3600 秒前的连接直接报MySQL server has gone away。铁律RECYCLE必须小于MySQL 的wait_timeout建议设成它的 1/2。坑3SQLite 用在生产django.db.backends.sqlite3是文件数据库并发写会锁整个文件。开发可以生产别用。真要省成本用 PostgreSQL别用 SQLite。六、总结优先级动作1生产环境 MySQL → 换成dj_db_conn_pool.backends.mysql2你的POOL_OPTIONS配置是对的但要配对 ENGINE 才生效3RECYCLE查一下 MySQL 的wait_timeout确保 RECYCLE wait_timeout4PostgreSQL 优先用psycopg35别在生产用 SQLite那行 ENGINE值得你花 5 分钟认真选一次。