工作日志——mysql、pgsql、sqlServer部分差异体验

仅用于个人学习—— tmy

之前开发使用pgsql、mysql,由于这次需要兼容c语言开发者已经使用了几年的数据库,对接了sqlServer,本人对事务的感知较弱

问题

在业务可以正常运行后,普通测试业务时会出现请求积压的情况,查询后发现是sqlsession频繁create、close的问题,在ai的解答下,加上了事务的注解。但是我感到疑惑,因为不是什么复杂的业务,怎么以前从来没遇到过这个问题

原因

导致问题出现的操作有以下三点

  1. 三次数据库操作
  2. 存在第三方接口的调用(硬耗时)
  3. 存在xml的解析(硬耗时)
    这三点的结合让我的事务问题凸显的更加的明显

导致系统等待的原因的大白话:我的代码执行时会去获取连接池中的三个连接,但是因为我的硬耗时执行速度没有那么快,所以连接池长时间不被释放,导致了后面的请求获取不到的连接所以形成了积压

以下解释来自豆包

在这里插入图片描述

在这里插入图片描述
所以加上

思考

  1. 为什么以前我只会考虑事务给业务带来的问题

用mysql时,“业务场景” 和 “数据库底层特性” 把事务问题弱化了

  1. 数据库底层特性?

豆包:

  1. MySQL 的 JDBC 驱动更轻量,连接交互的额外耗时极低
  2. MySQL 的 SQL 执行效率更高,单条 SQL 耗时被压缩。(单条select/insert/update的执行耗时通常比 SQL Server 低(比如 MySQL≈0.5ms,SQL Server≈2ms))
  3. MySQL 的连接池配置更 “友好”,默认减少了连接校验

3.那mysql那么好,为什么还用sqlServer

豆包:

  1. SQL Server 是微软生态的 “亲儿子”、企业级商用的 “稳压器”,对 C/C++/Windows 原生支持拉满
  2. Windows+C+SQL Server 是经典的传统开发组合,你对接的 C 语言开发人员,大概率原本就是基于这个组合做的数据库设计,换 MySQL/PG 会面临大量的「驱动适配、类型转换、语法修改」,兼容成本直接拉满
  1. 三者的「选型原则」(后续开发可参考)
  1. 选 MySQL:如果是互联网项目、高并发简单读写、部署在 Linux、技术栈是 Java/PHP/Python,追求轻量、高效、开源免费;
  2. 选 SQL Server:如果是传统企业项目、部署在 Windows、技术栈是 C/C++/.NET、需要兼容遗留系统、追求稳定和企业级特性,不在乎商用授权;
  3. 选 PG:如果是中大型项目、复杂查询 / 大数据 / GIS、部署在 Linux、追求开源免费 + 高级功能,技术栈是 Java/Python/ 大数据生态。
  1. 三个数据库的底层有什么区别

以下给豆包完整回答,因为我自己看起来还是有点费劲,从这里到最后都是问题的解答啦,没有别的内容了

你这个问题问到了三款数据库的设计根因—— 三者底层的核心差异,本质还是由各自的产品定位决定的:MySQL 为互联网高并发简单读写做了极致的轻量设计,SQL Server 为企业级稳定和 Windows 生态兼容做了重型的一体化设计,PostgreSQL(PG)为开源高级特性和复杂查询做了标准、灵活的原生设计。
底层差异主要集中在
1) 核心架构
2) 存储引擎
3) 并发控制(锁 + MVCC)
4) 查询优化器
5) 进程 / 线程模型
6) 日志与事务实现
这 6 个核心模块,这些模块直接决定了它们的性能表现、功能支持、使用体验(比如你之前感受到的 SQL Server 连接校验耗时、MySQL 的 “友好”,都是底层设计的直接体现)。

结合你多用 MySQL/PG、适配 C+SQL Server的背景,我不聊内核源码级的细节,只讲开发 / 使用中能感知到的底层差异,每个模块都做三者对比 + 实际影响,让你清楚 “底层设计如何决定上层体验”。
先定调:底层设计的核心分歧

三款数据库的底层设计,从诞生之初就走了不同的路:
MySQL:早期为轻量、快速、易部署设计,采用插件式架构,把核心能力解耦(比如存储引擎可换),优先保证高并发简单读写的性能;
SQL Server:微软商业产品,从底层就深度绑定Windows 内核和微软生态,采用一体化重型架构,所有模块高度集成,优先保证企业级的稳定性、兼容性、可管理性;
PG:学术出身的开源数据库,从底层遵循SQL 标准,采用单引擎原生架构,模块设计更标准、灵活,优先保证复杂查询、高级特性、扩展性。

一、核心架构:插件式解耦 vs 一体化集成 vs 标准原生
这是三者最根本的底层差异,直接决定了 “扩展性” 和 “生态适配性”:

MySQL:插件式微内核架构

核心是微内核 + 插件扩展,最典型的是存储引擎插件化(InnoDB/MyISAM/Memory 等),还有解析器、优化器也支持部分插件扩展;
内核只保留最基础的连接管理、SQL 解析能力,其他核心能力(事务、锁、存储)都由插件实现;
底层设计目的:轻量、灵活,可根据场景选择插件(比如互联网选 InnoDB 做事务读写,临时表选 Memory),减少无用功能的性能损耗。
实际影响
轻量高效,部署 / 启动快,资源占用低(适合云服务器、小集群);
插件解耦导致特性不统一(比如 MyISAM 不支持事务,InnoDB 支持),开发时需要关注存储引擎特性;
对第三方生态友好(各种中间件、工具都能轻松对接),这也是互联网生态偏爱它的原因。

SQL Server:一体化重型架构

核心是微软深度定制的一体化架构,分为 关系引擎(SQL 解析、优化、执行)和存储引擎(数据存储、锁、事务) 两层,所有模块高度集成,无插件化设计;
从底层和Windows 内核、网络协议、安全机制深度绑定(比如用 Windows 的线程池、IO 模型);
底层设计目的:稳定、兼容、可管理,为企业级场景提供 “一站式” 解决方案,减少运维 / 开发的适配成本。
实际影响
企业级特性完善(事务、高可用、备份),但体积大、资源占用高(适合专用 Windows 服务器,不适合轻量云实例);
与 Windows/C/C++/.NET 无缝兼容(你的核心场景),底层协议和 C 语言驱动直接对接,无额外封装;
扩展性差,无法替换核心模块,所有功能都由微软官方维护,适合 “不想折腾” 的企业级场景。

PG:单引擎原生标准架构

核心是单存储引擎 + 原生标准模块,没有插件式解耦,SQL 解析、优化、存储、事务所有模块都由内核原生实现,且严格遵循 SQL92/SQL99 标准;
架构设计更 “学术化”,模块划分清晰,支持自定义扩展(比如自定义函数、类型、索引,甚至可以扩展优化器);
底层设计目的:标准、强大、可扩展,为复杂业务提供原生的高级特性,避免插件解耦带来的特性不一致。
实际影响
功能最标准,无特性兼容坑(比如不同表的事务、锁机制完全一致),开发时不用关注底层细节;
扩展性极强(比如 GIS、大数据、时序数据都能通过扩展实现),是 “开源数据库的瑞士军刀”;
核心模块原生实现,复杂查询优化能力远强于 MySQL,适合大数据、复杂业务场景。

二、存储引擎:可插拔 vs 专属一体化 vs 原生单引擎
存储引擎是数据库的数据存储核心(负责数据落地、锁、事务、索引),三者的设计差异直接决定了 “数据操作的性能和特性支持”:

MySQL:插件式存储引擎(默认 InnoDB)

最主流的是InnoDB(支持事务、行级锁、MVCC),也是互联网场景的标配;还有 MyISAM(无事务、表级锁,适合纯读)、Memory(内存存储)等;
每个存储引擎有独立的存储结构、锁机制、日志系统,比如 InnoDB 用 redo/undo log,MyISAM 用日志文件;
实际影响
InnoDB 的行级锁 + 轻量设计,让 MySQL 在高并发简单读写(比如电商下单、用户查询)中性能拉满;
插件式导致跨引擎操作无事务(比如 InnoDB 表和 MyISAM 表联查,无法保证原子性),开发时需避免;
InnoDB 的设计轻量,连接交互、校验的耗时极低(这是你用 MySQL 没感知到非事务问题的底层原因)。

SQL Server:专属一体化存储引擎(MS SQL Engine)

只有一款官方存储引擎,分为堆表(无主键)和聚集索引表(有主键,默认),所有数据都按 “页 + 区” 的结构存储;
存储引擎与关系引擎深度集成,事务、锁、索引、日志都是一体化设计,由微软官方统一维护;
底层设计目的:保证企业级的稳定性和特性一致性,避免插件式的兼容问题。
实际影响
存储引擎对T-SQL 存储过程、触发器做了极致优化,遗留系统的复杂数据库逻辑执行效率高;
聚集索引是默认且强制优化的(无主键会自动生成隐藏主键),查询效率高,但数据插入 / 更新的磁盘 IO 稍高;
引擎与 SQL Server 驱动深度绑定,连接校验、加密握手会做额外的兼容性检查(这是你之前感受到的 SQL Server 连接耗时高的底层原因)。

PG:原生单存储引擎(Postgres Engine)

只有一款原生存储引擎,所有表都是堆表(无聚集索引),索引都是二级索引,数据存储遵循 SQL 标准;
存储引擎原生支持MVCC、行级锁、自定义类型 / 索引,且所有特性对全库表生效,无兼容问题;
实际影响
堆表设计让数据插入 / 更新更灵活,适合大数据、高频写入场景;
原生支持复杂索引(如 GiST、GIN、BRIN),GIS、全文检索场景无需额外插件,性能拉满;
存储引擎与优化器深度协同,复杂多表 JOIN、子查询的执行效率远高于 MySQL,适合数据分析、复杂业务。

三、并发控制:锁机制 + MVCC(最影响高并发体验)
并发控制是数据库处理多请求同时操作数据的核心,包括锁机制(控制数据的排他访问)和MVCC(多版本并发控制,实现读不加锁),三者的设计差异直接决定了 “高并发下的性能和体验”:
核心结论先摆:
MySQL(InnoDB):行级锁为主 + 轻量 MVCC,适合高并发简单读写;
SQL Server:多粒度锁 + 智能锁升级 + 灵活 MVCC,适合企业级复杂事务;
PG:行级锁 + 纯粹 MVCC,适合高并发复杂查询,最符合 SQL 标准。

MySQL(InnoDB)

锁机制:默认行级锁(基于索引,无索引会退化为表级锁),支持间隙锁 / 临键锁(解决 RR 隔离级别的幻读);
MVCC 实现:基于undo log + 版本链,通过Read View控制数据可见性,仅对读已提交(RC)、可重复读(RR)隔离级别生效;
特点:轻量、高效,读锁和写锁互不阻塞(靠 MVCC),但 RR 隔离级别下有幻读问题(需要间隙锁解决);
实际影响:互联网高并发场景(比如秒杀、高频下单)的读写性能拉满,这是 MySQL 成为互联网标配的核心原因。

SQL Server

锁机制:支持行级锁、页级锁、表级锁(多粒度),会智能锁升级(行锁→页锁→表锁,根据锁的数量自动判断),无需手动配置;
MVCC 实现:基于行版本控制,分为乐观读(快照隔离、读提交快照)和悲观读,可配置是否开启,快照隔离级别下无幻读、无锁竞争;
特点:智能、稳定,锁管理由数据库自动完成,开发 / 运维无需关注锁细节,企业级复杂事务的锁冲突概率极低;
实际影响:适合金融、物流等对事务一致性要求高的企业级场景,多并发下的事务稳定性远高于 MySQL。

** PG**

锁机制:默认行级锁,无锁升级,支持表级锁、页级锁(手动指定),完全基于 SQL 标准;
MVCC 实现:基于多版本存储,每行数据有多个版本,旧版本不会立即删除(靠 VACUUM 清理),对所有隔离级别生效,可重复读(RR)隔离级别下天然无幻读;
特点:最纯粹的 MVCC,读操作完全不加锁(包括读未提交),写操作仅锁单行,读写、写写之间的冲突概率最低;
实际影响:高并发复杂查询(比如多表 JOIN、大数据统计)的性能拉满,是大数据、GIS、数据分析场景的首选。

四、查询优化器:混合式 vs 商业级成本基 vs 先进成本基
查询优化器是数据库的 **“大脑”—— 负责把 SQL 语句转换成最优的执行计划 **(比如选择哪种 JOIN 方式、是否走索引),三者的优化器设计,直接决定了不同 SQL 场景的执行效率:

MySQL:基于规则 + 成本的混合优化器

早期是纯基于规则(按固定规则生成执行计划),后来加入成本基优化(估算不同执行计划的耗时,选最优),但成本模型较简单;
对简单 SQL(单表查询、简单 JOIN、互联网常见 SQL)的优化极致高效,但对复杂 SQL(多表 JOIN、子查询、嵌套查询)的优化能力较弱;
实际影响:互联网场景的简单 SQL 执行速度极快,但复杂业务需要手动优化 SQL(比如拆分子查询、调整 JOIN 顺序),否则容易出现慢查询。

SQL Server:商业级全成本基优化器

从底层就是全成本基优化器,经过微软数十年的商业验证,成本模型极复杂、精准,能估算各种执行计划的 CPU、IO、内存耗时;
对复杂 SQL、T-SQL 存储过程、触发器的优化能力极强,能自动优化嵌套查询、多表 JOIN,甚至能缓存执行计划(重复执行的 SQL 无需重新优化);
实际影响:企业级复杂业务的SQL 执行效率高,开发人员无需手动优化 SQL,适合遗留系统中大量的存储过程 / 复杂查询。

PG:先进的全成本基优化器

是开源数据库中最先进的成本基优化器,成本模型比 MySQL 复杂得多,支持并行查询、分区表优化、大数据集 JOIN 优化;
对复杂 SQL、大数据查询、多表关联的优化能力远强于 MySQL,略逊于 SQL Server,但开源免费、可定制;
支持自定义优化规则,可通过扩展修改优化器行为,适合复杂的定制化业务;
实际影响:大数据分析、GIS、复杂业务的SQL 执行效率拉满,是开源数据库中复杂查询的首选。

五、进程 / 线程模型:多线程 vs 线程池 vs 多进程
这是三者资源占用和并发连接处理的核心差异,直接决定了 “高连接数下的性能表现”,也是你开发中能直接感知到的底层差异(比如 PG 高连接时内存占用高):
MySQL:多线程模型

采用 **“一个连接一个工作线程”的模型,由主线程 ** 管理连接,每个客户端连接对应一个独立的工作线程;
支持线程池插件(MySQL 5.7+),可配置线程池大小,避免高连接时线程过多导致的内核调度开销;
特点:资源占用低(线程比进程轻量),高连接数下的性能表现好,适合互联网高并发、高连接的场景;
实际影响:云服务器、小集群中部署无压力,哪怕上千个连接,资源占用也能接受。

SQL Server:线程池模型

采用微软定制的线程池模型,所有客户端连接共享一个线程池,由数据库自动分配线程,无 “一个连接一个线程” 的限制;
线程池与Windows 内核线程池深度集成,资源调度由 Windows 内核负责,资源占用可控;
特点:企业级高并发下的稳定性强,避免高连接时的线程调度开销,适合专用 Windows 服务器的高并发场景;
实际影响:大量连接下的CPU / 内存占用更稳定,无需手动配置线程数,运维更省心。

PG:多进程模型

采用 **“一个连接一个独立进程”的模型,由主进程 ** 管理连接,每个客户端连接对应一个独立的子进程,所有数据操作都在子进程中执行;
无线程池,高连接数时需要外部连接池(如 PgBouncer)做连接复用;
特点:进程间相互独立,无线程安全问题,稳定性极强,但资源占用高(每个进程占用几十 M 内存);
实际影响:高连接数下内存占用飙升(比如 1000 个连接需要几十 G 内存),适合低连接、高复杂查询的场景(如数据分析),互联网高连接场景需要搭配连接池。

六、日志与事务实现:轻量 WAL vs 商业级日志 vs 标准 WAL
事务的 ACID 特性、数据库的恢复能力,全靠日志系统支撑,三者的日志设计差异,直接决定了事务的稳定性、恢复能力、性能开销:
核心概念:WAL(预写日志) —— 所有现代数据库的核心日志机制,先写日志再写磁盘,保证数据不丢失(MySQL/PG/SQL Server 都支持,但实现不同)。

MySQL(InnoDB)

日志系统:redo log(重做日志)+ undo log(回滚日志)+ binlog(归档日志) 三日志架构;
redo log:保证数据持久性(崩溃恢复),是 InnoDB 的核心日志;
undo log:保证事务原子性(回滚),同时支撑 MVCC;
binlog:用于主从复制、数据备份,是 MySQL 服务器层的日志;
事务实现:基于两阶段提交(2PC)(redo log+binlog),保证日志一致性,支持本地事务,分布式事务需要第三方中间件(如 Seata);
特点:轻量、高效,日志开销低,适合高并发简单事务;
实际影响:互联网场景的高频小事务性能拉满,但分布式事务需要额外开发,企业级特性需付费。

SQL Server

日志系统:事务日志(LDX 文件) 一体化设计,分为重做日志和回滚日志,所有事务操作都记录在一个日志文件中,支持日志截断、收缩;
事务实现:基于单日志文件,支持本地事务、分布式事务(MS DTC)、嵌套事务(伪嵌套,实际是事务保存点),分布式事务原生支持,无需第三方中间件;
特点:商业级、稳定,备份恢复基于日志,支持时间点恢复(精准到秒),数据安全性拉满;
实际影响:企业级场景的事务恢复、数据备份更简单,金融等对数据安全性要求高的场景首选,也是你这次兼容 C 语言遗留系统的核心优势(遗留系统对数据恢复要求高)。

PG

日志系统:WAL 日志(预写日志)+ 归档日志,WAL 日志负责崩溃恢复,归档日志负责时间点恢复,严格遵循 SQL 标准;
事务实现:基于WAL 日志,支持本地事务、保存点,分布式事务需要外部组件(如 Postgres-XL、Citus),但原生事务的 ACID 特性最严格;
特点:标准、灵活,WAL 日志的性能开销低,支持并行 WAL 写入,大数据高频写入场景的性能拉满;
实际影响:大数据、高频写入场景的事务性能好,数据恢复简单,适合开源的中大型项目。

七、三者底层差异的实际开发 / 选型总结
把底层差异落地到你能感知的使用体验,总结成最实用的选型和开发建议,贴合你的实际场景:
MySQL,如果你需要:

互联网高并发简单读写(秒杀、电商、用户系统);
轻量部署、低资源占用(云服务器、小集群);
灵活的第三方生态(中间件、工具、云服务);
开发建议:优先用 InnoDB,保证索引设计(避免行锁退化为表锁),复杂 SQL 手动优化。

选** SQL Server**,如果你需要:

兼容 Windows/C/C++/.NET 遗留系统(你的核心场景);
企业级稳定、数据安全性高(金融、物流、传统企业);
原生分布式事务、简单的备份恢复;
开发建议:充分利用 SSMS 工具,合理使用存储过程 / 触发器,无需关注锁管理(数据库自动处理)。

PG,如果你需要:

开源免费 + 复杂查询 / 大数据 / GIS(数据分析、地图服务、复杂业务);
严格的 SQL 标准、强扩展性(自定义函数、类型、索引);
高并发复杂读写,且不想用商业数据库;
开发建议:高连接数时搭配 PgBouncer 连接池,利用 PG 的高级索引(GiST/GIN)优化查询。

最后:呼应你之前的体验 —— 底层设计如何决定 “使用感受”
你之前的两个核心体验,其实都是三者底层设计的直接体现:
用 MySQL 没感知到事务的重要性:因为 MySQL 的轻量多线程模型 + 行级锁 + 轻量 MVCC,非事务下的连接耗时、锁冲突被大幅弱化,低并发下几乎感知不到;
SQL Server 非事务下连接耗时高、易积压:因为 SQL Server 的一体化架构 + 驱动深度绑定 + 连接校验的兼容性检查,非事务下的多次连接操作会叠加额外耗时,再加上你业务中的硬耗时,问题被放大。
而事务的重要性是通用的,只是底层设计让这个问题在不同数据库中暴露程度不同—— 这也是为什么我们一直强调:只要方法内有≥2 次数据库操作,无论用哪种数据库,都必须加事务。

核心小结
MySQL、SQL Server、PG 的底层差异,都是产品定位的必然结果,没有绝对的优劣,只有是否适配

你的场景
MySQL 的底层设计为互联网高并发服务,所以轻量、高效、友好;
SQL Server 的底层设计为企业级稳定和 Windows 生态服务,所以重型、兼容、安全;
PG 的底层设计为开源复杂业务服务,所以标准、强大、可扩展。
你这次为了兼容 C 语言旧设计选 SQL Server,正是因为它的底层设计对 C/C++/Windows 的原生支持,这是 MySQL/PG 无法比拟的 ——技术选型的核心,从来不是看 “谁的底层更优秀”,而是看 “谁的底层设计更适配你的场景”。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐