如何比较Python中不同异步数据库驱动的性能表现?

P粉602998670

P粉602998670

2026-08-04

942人浏览

原创

asyncpg在高并发简单查询场景下qps通常是aiopg的2–3倍,因asyncpg直接实现postgresql二进制协议,而aiopg仅为psycopg2的异步封装,需经同步协议层。

如何比较python中不同异步数据库驱动的性能表现?

asyncpg 与 aiopg 的吞吐量实测差异

asyncpg 在高并发简单查询场景下,QPS 通常是 aiopg 的 2–3 倍。这不是理论值,而是用 abtoolbench 在相同硬件、相同 PostgreSQL 实例、相同连接池配置(min_size=10, max_size=50)下跑出来的稳定结果。

根本原因在于 aiopg 是对 psycopg2 的 asyncio 封装,仍需经过 psycopg2 的同步协议层;而 asyncpg 直接实现 PostgreSQL 二进制协议,跳过了文本解析和中间转换开销。

  • 测试时务必关闭连接池的自动重连逻辑(min_size == max_size),否则重连抖动会污染延迟数据
  • 避免在测试中混用事务——BEGIN; SELECT; COMMIT 这类操作会让 aiopg 的锁竞争更明显
  • asyncpg 的 fetch()fetchrow() 多一次序列化,压测时统一用 fetchrow() 才公平

连接池参数对 P99 延迟的实际影响

默认的 min_size=10, max_size=10 在并发 200+ 时会立刻暴露问题:P99 延迟从 15ms 跳到 200ms+,不是数据库慢了,是新请求在等空闲连接。

asyncpg 的连接池扩容是非阻塞的,但建立新连接本身要走 TCP 握手 + SSL 协商 + PostgreSQL 认证,这个过程在协程里仍是耗时操作(约 50–150ms)。如果 max_size 设得太小,大量请求就会卡在 pool.acquire() 上。

Python 3.14.2
Python 3.14.2

Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。

下载
  • 生产环境建议按 max_size = min(100, cpu_count * 10) 起步,再根据 pool.get_idle_connection_count() 监控调整
  • 不要依赖 min_size 预热——asyncpg 不保证启动时就建满 min_size 个连接,得靠首次请求触发
  • 连接泄漏比连接不足更危险:一个未 await pool.release(conn) 的异常路径,会让连接永远滞留在池中

aiomysql 和 asyncpg 的基准测试不能直接比

拿 aiomysql 对标 asyncpg 的 QPS 数值没有意义。两者底层协议完全不同:MySQL 使用文本协议 + 自定义握手流程,PostgreSQL 使用二进制协议 + SASL 认证。它们的网络往返次数、单次响应体积、类型编解码成本都不在一个量级。

真正该比的是「单位资源下的业务吞吐」:比如每秒处理多少笔订单(含 INSERT + SELECT + UPDATE),而不是单纯跑 SELECT 1

  • 测试必须包含真实字段类型(jsonb, timestamp with time zone, numeric),这些类型在 asyncpg 里有专用 codec,在 aiomysql 里常退化为字符串解析
  • 批量写入场景下,asyncpg 的 executemany() 比 aiomysql 的 executemany() 快得多,因为前者支持二进制 COPY 协议
  • 别信“同样 100 并发下谁更快”——先确认你的应用实际并发峰值是多少,再按那个数字去调参

性能数据容易被忽略的三个上下文

所有公开的 benchmark 报告都省略了关键约束条件:PostgreSQL 版本、客户端所在机器的 CPU 核心数、是否启用 jitshared_buffers 设置、甚至驱动安装方式(pip install asyncpg vs pip install asyncpg[uvloop])。

比如 uvloop 加速对 asyncpg 有效,但对 aiopg 几乎无感,因为瓶颈不在事件循环,而在 psycopg2 的 C 层阻塞调用。

  • 本地开发机跑出的 5000 QPS,在云服务器上可能只有 800 QPS——网卡、磁盘 I/O、TCP buffer 都不同
  • asyncpg 的 prepare 缓存默认只存 100 条,高频动态 SQL 场景下缓存命中率暴跌,这时要手动调大 statement_cache_size
  • Python 3.12 的 asyncio 调度器改进对 aiopg 无效,但它让 asyncpg 的连接复用延迟降低了约 12%

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1105

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2072

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8822

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1552

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

531

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习