从MySQL迁移到PostgreSQL(简称PG)的用户,最先遇到的问题是连接数管理。核心原因是两者底层架构存在本质差异,导致连接数管理逻辑不同。
| 特性 | MySQL(线程架构) | PostgreSQL(进程架构) |
|---|---|---|
| 连接处理方式 | 基于线程(Threads),共享主进程内存空间 | 基于多进程(Processes),主进程(postmaster)通过fork创建独立后端进程(postgres) |
| 资源开销 | 轻量级,上下文切换开销小 | 重量级,拥有独立内存空间,创建与调度开销大 |
| 连接数支持 | 可稳定支持上千连接,max_connections=2000可正常运行 |
默认可用连接数显著低于MySQL,高连接场景易出现异常 |
| 资源分配方式 | 线程共享主进程资源 | 每个连接对应独立进程,单独分配资源 |
PG稳定运行无需高并发连接,维持几十到两三百个并发连接即可保障稳定性,核心在于提升连接利用率,不应直接将max_connections配置为几百上千。
PGBouncer是PG社区主流连接池工具,作为客户端与PG服务器的中间层: