| ENGINE | 本质 | 连接池 | 底层驱动 | MySQL 8.0 | 推荐场景 |
|---|---|---|---|---|---|
django.db.backends.mysql |
Django 原生 | ❌ 无 | mysqlclient | ✅ | 开发 / QPS < 50 |
dj_db_conn_pool.backends.mysql |
第三方连接池 | ✅ 有 | DBUtils + mysqlclient | ✅ | 生产环境首选 |
mysql.connector.django |
MySQL 官方驱动 | ❌ 无 | mysql-connector-python | ✅ | 兼容优先 |
1. django.db.backends.mysql --- Django 亲生的
python
'ENGINE': 'django.db.backends.mysql',
这是 Django 自带的,不需要装任何额外包。
底层调用 mysqlclient(C 扩展,性能最好)。
| 特性 | 说明 |
|---|---|
| 连接池 | ❌ 没有,每次请求开连接,结束关连接 |
POOL_OPTIONS |
❌ 不认识,直接忽略 |
| 性能 | ⭐⭐⭐⭐⭐(C 扩展,最快) |
| 稳定性 | ⭐⭐⭐⭐(Django 官方维护) |
| MySQL 8.0 | ✅ 兼容(mysqlclient 2.0+) |
你之前的配置里写了 POOL_OPTIONS,但它被完全忽略了,等于白写。
2. dj_db_conn_pool.backends.mysql --- 带连接池的
python
'ENGINE': 'dj_db_conn_pool.backends.mysql',
这是第三方包,基于 DBUtils.PersistentDB 封装的连接池。
底层还是 mysqlclient,但外面包了一层池化管理。
| 特性 | 说明 |
|---|---|
| 连接池 | ✅ 有,POOL_OPTIONS 生效 |
POOL_SIZE |
池里最多放几个连接 |
MAX_OVERFLOW |
池满了还能额外创建几个 |
RECYCLE |
连接存活多久后强制重建(必须 < MySQL wait_timeout) |
TIMEOUT |
池满时等多久,超时报错 |
| 性能 | ⭐⭐⭐⭐(多一层封装,损耗极小) |
| 稳定性 | ⭐⭐⭐⭐(社区维护,很成熟) |
| MySQL 8.0 | ✅ 兼容 |
你现在的配置应该用这个,才能让 POOL_OPTIONS 生效。
3. mysql.connector.django --- MySQL 官方出的
python
'ENGINE': 'mysql.connector.django',
这是 MySQL 官方团队维护的 Django 后端。
底层用 mysql-connector-python(纯 Python 实现,不是 C 扩展)。
| 特性 | 说明 |
|---|---|
| 连接池 | ❌ 没有(官方认为 Django 自己管就够了) |
| 驱动 | 纯 Python,不依赖 C 扩展 |
| 性能 | ⭐⭐⭐(比 mysqlclient 慢 20~30%) |
| 兼容性 | ⭐⭐⭐⭐⭐(MySQL 官方维护,8.0 认证插件无缝支持) |
| 部署 | ⭐⭐⭐⭐⭐(不用装系统级 mysqlclient,pip install 就行) |
什么时候用它?
- 你的服务器装不了
mysqlclient(缺少编译环境) - 用了 MySQL 8.0 的
caching_sha2_password认证,mysqlclient版本太老不支持 - Docker 镜像不想装系统依赖
一张图总结
Django 查询
│
├── django.db.backends.mysql ──────────→ mysqlclient(C扩展,快,无池)
│
├── dj_db_conn_pool.backends.mysql ────→ DBUtils 连接池 → mysqlclient(有池,推荐✅)
│
└── mysql.connector.django ────────────→ mysql-connector-python(纯Python,兼容好)
你该用哪个?
| 你的情况 | 选这个 |
|---|---|
| 生产环境,QPS > 50 | dj_db_conn_pool.backends.mysql ✅ |
| 开发 / 测试 | django.db.backends.mysql |
| 装不了 mysqlclient / MySQL 8.0 认证有问题 | mysql.connector.django |
| 想要连接池 + 官方驱动 | 用 ProxySQL(前面博客讲过) |
你现在的配置,把 ENGINE 改成 dj_db_conn_pool.backends.mysql,然后 pip install dj-database-url dj-db-conn-pool,重启就能用连接池了。