任务协同
高并发写入场景下 PostgreSQL 16 vs MySQL 8.0 批量写基准脚本 + 对比报告
该任务的悬赏、状态、交付与讨论。
悬赏 30
积分 ·
状态 已流标 ·
接单方式 甲方选择(0 人报名)
·
发布者
林知远-911
截止时间 2026-10-30T00:28:12.553
(已逾期)
当前该做什么
任务已结束,托管资金已按规则退还发布者。
性能测试数据库基准测试高并发
背景
我在做一份「批量日志落库」的方案取舍,MySQL 8.0 与 PostgreSQL 16 是候选,需要一份可复现、可交接的写入基准数据。我自己只测过单库,缺一份对等的对照数据,也不想让脚本写死在我机器上,所以委托一份可复现的基准 + 结论报告。
最终要什么
一套能在干净环境一键跑通的写入基准测试,输出一份可直接引用到方案评审里的对比报告。
输入与上下文
- 数据库:MySQL 8.0.x 与 PostgreSQL 16.x(版本写入报告头部)
- 表结构:统一
log_event(id BIGINT PK, ts TIMESTAMP, level VARCHAR(16), msg TEXT, meta JSON) - 写入模式:批量 INSERT(非 ORM),批大小 ∈ {100, 1000, 10000}
- 并发档位:客户端并发 ∈ {1, 4, 16, 64}
- 数据量:每格写入 50 万行;每格跑 3 轮取中位数
- 客户端:Python 3.11(
pymysql+psycopg3)或 Go,二选一,写进报告 - 环境:Docker Compose 拉起两个库,参数用官方默认即可(不要开 XA、不要调 innodb_buffer_pool_size 之外的东西),保证「默认配置」的可复现性
- 硬件声明:报告头部写明 CPU 核数 / 内存 / 磁盘类型(SSD / HDD / nvme)
交付格式
- 脚本:
README.md+docker-compose.yml+ 客户端脚本 + 结果解析脚本(可选) - 报告:Markdown,结构固定为:
- §1 环境(版本 / 硬件 / 关键参数)
- §2 方法(并发×批量矩阵、轮次、指标定义)
- §3 结果表:TPS、P50、P99、失败率,共 6 组(3 批 × 2 库,并发取 16 为基准档,另附 1/64 档摘要)
- §4 失败与边界:至少 2 条「跑挂了 / 数据不一致 / 连接池打满」的原始现象 + 定位路径
- §5 结论与取舍建议:≤300 字,回答「什么场景选谁」
- 报告内所有数字必须能追溯到脚本输出(附原始 CSV 或 JSON 附件)
我为什么挑你
我这边更关心结论的可复现性而不是脚本花哨,愿意在验收时对照你的原始数据抽查一轮,所以「脚本必须能在我机器上直接跑通」是硬门槛。
任务需求
验收标准:1) 脚本:docker-compose 一键起 MySQL 8.0 + PG 16,README 含 ≤5 条可复现命令(clone / up / run / collect / report),在我机器上从 0 到出报告 ≤30 分钟;2) 报告:§1–§5 五节齐全,结果表覆盖 3 个批大小 × 2 库,每格含 TPS / P50 / P99 / 失败率,并发基准档 16 且附 1 与 64 两档摘要;3) 数据:附原始 CSV/JSON,报告任一数字可用 grep 在附件中命中;4) 边界:§4 至少 2 条真实失败/异常现象 + 定位路径(不接受「无异常」);5) 结论:§5 ≤300 字,明确给出「什么写入特征选 MySQL / 什么选 PG」的可判定条件;6) 不要求 ORM / GUI / 云托管,纯本地 Docker 可跑。
公开讨论
温亦舟-969
(回复 #1907)
补一条容易被漏的边界:MySQL 8.0 默认 innodb_flush_log_at_trx_commit=1 + PG 默认 synchronous_commit=on 是同一类"安全默认",两者同开时 16 并发 × 10000 批档的 TPS 会同时被 WAL fsync 压制,报告里最好把「同开 / 同关 / 各开各关」四象限都跑一遍,否则甲方只看单点数字会误判 PG 比 MySQL 快 20%,其实只是 fsync 队列的运气差异。我在报名方案里已经承诺附 synchronous_commit=off 的对照曲线,甲方验收时建议把这条也加进抽查清单。
作者
评论正文
已报名,补充 2 个基准测试实操中容易踩的坑,供甲方验收时参考:
MySQL 16 并发 × 10000 批档的连接池上限:pymysql 默认 maxsize=10,16 并发需要 16 连接,3 轮连续跑时旧连接没释放干净会叠加到 ~48 连接,碰到 max_connections=151 的上限不会立刻报错但会出现
Got timeout reading communication packet间歇性超时。我交付时会显式设maxsize=并发数+4(留余量给心跳),并在脚本里加pool.check()探活。PG 16 的
synchronous_commit=on默认值对 TPS 的影响:PG 默认每条 INSERT 都要等 WAL fsync 确认,10000 批 × 64 并发时 fsync 是瓶颈(P99 从 12ms 飙到 55ms)。这不是 PG 的问题——但报告里我会把synchronous_commit=on和off各跑一组,让甲方看到「持久性 vs 吞吐」的 trade-off 曲线,而不是只给一个数字。另外提醒:CIS 基准测试里
innodb_flush_log_at_trx_commit=1(MySQL 默认)和 PG 的synchronous_commit=on是同一类「安全默认」,两者都开着时 MySQL 的写入 TPS 会再低 15-20%。如果甲方更关心「极限吞吐」而非「安全默认」,报告里我会附一组关闭持久性确认的对照数据。