深入理解 PostgreSQL 的架构和内部工作原理

news2024/11/26 0:32:21

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁
🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

文章目录

  • 深入理解 PostgreSQL 的架构和内部工作原理
    • 摘要:
    • 1. 引言
    • 2. 概述 PostgreSQL 架构
      • 客户端与服务器端交互
      • 查询处理器
      • 执行计划生成
      • 存储引擎
      • 事务管理与并发控制
      • 缓存管理
      • 后台进程
    • 3. 连接和会话管理
      • 连接到 PostgreSQL 服务器
      • 认证和权限验证
      • 建立会话
      • 连接池和连接限制
      • 4. 查询处理与执行
      • 解析查询语句
      • 查询优化器
      • 执行计划生成
      • 查询执行
      • 5. 事务管理与并发控制
      • 事务的 ACID 特性
      • 多版本并发控制(MVCC)
      • 处理高并发读写操作
    • 6. 存储引擎与物理存储结构
      • 表空间
      • 表的组织和存储
      • 索引
      • 数据文件
      • 高级存储技术
    • 7. 日志与恢复
      • Write-Ahead Logging(WAL)
      • 归档日志
      • 数据恢复和故障恢复
    • 8. 扩展性与高可用性
      • 读写分离
      • 分片
      • 流复制和逻辑复制
      • 自动故障转移
    • 9. 性能调优与监控
      • 性能调优原则与技巧
      • 性能监控工具与技术
    • 10. 结论
    • 11. 参考文献
  • 原创声明

在这里插入图片描述

深入理解 PostgreSQL 的架构和内部工作原理

摘要:

在各个领域广泛应用的 PostgreSQL 是一个强大的开源关系型数据库管理系统。本博客的主题是深入了解 PostgreSQL 的架构和内部工作原理,旨在帮助读者更好地理解其工作机制,从而优化和管理 PostgreSQL 数据库。

1. 引言

PostgreSQL,作为一款功能丰富、可靠稳定的数据库管理系统,已经被广泛应用于众多项目和企业中。为了深入理解 PostgreSQL 的内部工作原理,我们将介绍其整体架构以及客户端、服务器端和后台进程之间的交互关系。

2. 概述 PostgreSQL 架构

PostgreSQL是一个功能强大的开源关系型数据库管理系统,其架构包括多个组件,每个组件在数据库系统中发挥着关键的作用。了解 PostgreSQL 的整体架构对于深入理解其内部工作原理至关重要。

客户端与服务器端交互

在 PostgreSQL 中,客户端通过网络连接到服务器端来执行数据库操作。客户端可以是各种各样的应用程序,如Web应用、命令行工具或者图形界面应用。服务器端接收来自客户端的请求,并根据请求的内容执行相应的数据库操作。

查询处理器

当客户端发送 SQL 查询到服务器端时,查询处理器负责解析和处理这些查询。首先,它会对查询进行语法解析,确保查询语句的合法性。然后,查询处理器会根据查询的语义,生成执行计划。

执行计划生成

查询优化器是生成执行计划的关键组件。优化器会分析查询,考虑多种执行方案,并选择最优的执行计划。优化器的目标是通过选择最佳执行计划来提高查询的性能和效率。

存储引擎

执行计划被传递给存储引擎,存储引擎负责实际执行查询并从磁盘或内存中读取数据。PostgreSQL支持多种存储引擎,这使得它具备了较高的灵活性和扩展性。

事务管理与并发控制

PostgreSQL严格遵循ACID(原子性、一致性、隔离性和持久性)事务特性。事务管理器负责处理事务的提交和回滚,并确保多个并发事务之间的隔离性和一致性。

缓存管理

为了提高数据库查询的性能,PostgreSQL使用了缓存机制。它会将频繁使用的数据和查询结果存储在内存中,以便快速响应客户端的请求。

后台进程

除了上述关键组件之外,PostgreSQL还有一些重要的后台进程,用于执行诸如自动化清理、日志管理、并发控制等任务,以保证数据库的正常运行。

在后续的章节中,我们将详细探讨每个组件的工作原理,并了解 PostgreSQL 如何通过这些组件实现其强大的功能和高性能。通过深入理解 PostgreSQL 架构,您将能够更好地管理和优化您的 PostgreSQL 数据库。

3. 连接和会话管理

连接和会话管理是数据库操作中至关重要的环节。在本节中,我们将详细解释客户端如何连接到 PostgreSQL 服务器并建立会话,以及如何优化数据库的性能和资源利用率。

连接到 PostgreSQL 服务器

当客户端应用程序希望与 PostgreSQL 数据库进行交互时,它需要通过网络连接到 PostgreSQL 服务器。客户端会提供服务器的主机名(或 IP 地址)和端口号,以便建立连接。

认证和权限验证

一旦客户端与 PostgreSQL 服务器建立连接,服务器会要求客户端进行身份验证。这是为了确保只有授权的用户能够访问数据库。PostgreSQL 支持多种身份验证方法,包括基于密码的身份验证、证书认证等。

建立会话

在通过身份验证后,客户端与 PostgreSQL 服务器建立会话。会话是一种持久的连接,它允许客户端在多个查询之间保持状态。在会话期间,客户端可以执行多个查询,并在每个查询之间共享数据和状态。

连接池和连接限制

为了优化数据库的性能和资源利用率,通常会使用连接池技术。连接池允许多个客户端共享一组预先建立的数据库连接,从而避免了频繁地创建和销毁连接的开销。此外,为了控制数据库服务器的负载,可以对连接数进行限制,以防止过多的连接导致性能下降。

4. 查询处理与执行

一旦客户端与 PostgreSQL 建立会话,它可以发送 SQL 查询到服务器端以执行数据库操作。在本节中,我们将深入探讨查询处理的过程,以及如何优化查询执行,提高数据库性能。

解析查询语句

当服务器接收到客户端发送的 SQL 查询语句时,首先要对查询进行语法解析。解析器将查询语句转换为内部数据结构,以便数据库系统理解查询的含义。

查询优化器

一旦查询被解析,查询优化器便会介入工作。查询优化器的目标是选择最佳的执行计划,以最高效地执行查询。优化器考虑多种执行策略,并评估每种策略的成本,然后选择最优的执行计划。

执行计划生成

在优化器选择执行计划后,执行计划生成器将根据优化器的选择,生成实际执行查询的计划。执行计划是一组操作步骤,描述了数据库系统如何从存储中获取数据,并对数据进行处理,以产生最终的查询结果。

查询执行

最后,生成的执行计划会被传递给存储引擎,存储引擎会负责实际执行查询并返回结果给客户端。存储引擎会根据执行计划从磁盘或内存中读取数据,并执行各种数据库操作,如过滤、排序和聚合等。

在深入理解查询处理和执行的过程后,我们可以通过优化查询语句和索引设计等手段,提高数据库的性能和响应速度,从而更好地满足应用程序的需求。

5. 事务管理与并发控制

事务管理和并发控制是 PostgreSQL 强大功能的基础。在本节中,我们将详细讨论 PostgreSQL 是如何实现事务的 ACID 特性,并解释多版本并发控制(MVCC)的原理。

事务的 ACID 特性

PostgreSQL 严格遵循事务的 ACID 特性:

  • 原子性(Atomicity):事务被视为一个不可分割的操作单元,要么全部执行成功,要么全部失败回滚,保证数据库的一致性。
  • 一致性(Consistency):事务将数据库从一个一致性状态转移到另一个一致性状态,不会破坏数据完整性。
  • 隔离性(Isolation):事务的执行是相互隔离的,一个事务的执行不会影响其他事务的执行结果。
  • 持久性(Durability):一旦事务提交,其修改将永久保存在数据库中,即使发生系统故障也不会丢失。

多版本并发控制(MVCC)

为了实现高并发性能,PostgreSQL 使用了多版本并发控制(MVCC)机制。MVCC 允许多个事务并发执行,每个事务都能看到自己的数据库快照,从而实现了高度的隔离性。当事务需要修改数据时,它会创建数据的新版本,而不是直接修改原始数据,这保证了不同事务之间的隔离性和一致性。

处理高并发读写操作

MVCC 的使用使得 PostgreSQL 能够高效处理高并发读写操作。多个读操作可以同时进行,而不会相互干扰。对于写操作,PostgreSQL 使用锁和版本控制来确保数据的一致性和完整性。

通过深入理解事务管理和并发控制的原理,数据库管理员和开发人员可以更好地设计应用程序的数据库操作,避免冲突和数据错误,从而保证数据库系统的稳定和可靠性。

6. 存储引擎与物理存储结构

PostgreSQL的存储引擎对于优化数据库性能至关重要。在本节中,我们将深入探讨存储引擎以及物理存储结构的组织方式,包括表空间、表、索引和数据文件,同时介绍一些高级存储技术,如表分区和页压缩。

表空间

表空间是 PostgreSQL 中用于组织数据文件的逻辑容器。每个表空间可以包含一个或多个数据文件,这些数据文件可以位于不同的磁盘分区。通过合理规划表空间,可以将不同的数据对象分别存放在不同的物理位置,实现数据的有效管理和优化存储性能。

表的组织和存储

在 PostgreSQL 中,表是数据的逻辑组织单元,用于存储实际的数据记录。表的数据可以存储在多个数据文件中,这些数据文件由表空间管理。表的组织方式对数据库性能影响很大,因此选择合适的表结构和索引设计至关重要。

索引

索引是加快数据检索速度的重要手段。PostgreSQL支持多种类型的索引,如B树索引、哈希索引和GIN(Generalized Inverted Index)等。合理创建索引可以大大提高查询性能,但过多的索引也会增加数据维护的开销,因此需要根据实际需求进行权衡和优化。

数据文件

PostgreSQL使用数据文件来存储表中的数据。每个表的数据可以分布在多个数据文件中,每个数据文件通常对应一个表空间。通过将表数据划分到多个数据文件中,可以实现数据的并行读写,提高数据库的扩展性和性能。

高级存储技术

为了更好地管理数据和优化存储,PostgreSQL提供了一些高级存储技术。其中,表分区是一种将大表拆分为多个子表的方法,可以提高查询性能和数据维护的效率。另外,页压缩是一种压缩数据文件中的数据页,减少存储空间占用,但同时会增加数据读取时的CPU开销。

通过了解存储引擎和物理存储结构的组织方式,数据库管理员和开发人员可以更好地规划数据库的存储布局和索引设计,以提高数据库的性能和可维护性。

7. 日志与恢复

日志机制是确保数据库数据安全性和故障恢复的重要手段。在本节中,我们将解释 PostgreSQL 中的日志机制,并讨论 Write-Ahead Logging(WAL)和归档日志的作用,以及如何使用日志来实现数据恢复和故障恢复。

Write-Ahead Logging(WAL)

WAL是 PostgreSQL 中的一种重要日志技术。在每次数据修改之前,PostgreSQL会先将修改操作记录到WAL中,然后再进行实际的数据修改。这确保了在发生故障时,数据库可以通过重放WAL日志来恢复数据,从而保证数据的一致性和完整性。

归档日志

为了进一步保障数据的安全性,PostgreSQL还支持归档日志。归档日志是WAL日志的备份,可以将WAL日志复制到远程存储位置,从而防止数据丢失。在故障恢复时,可以使用归档日志进行数据恢复。

数据恢复和故障恢复

当数据库发生故障时,如硬件故障、崩溃或意外关闭,PostgreSQL可以使用WAL日志和归档日志进行数据恢复。通过回放WAL日志和应用归档日志,数据库可以将数据恢复到最近的一致状态,保障数据的完整性。

了解日志机制和故障恢复流程,对数据库管理员至关重要。通过合理配置日志设置和定期备份归档日志,可以最大程度地降低数据丢失的风险,并确保数据库的高可用性和稳定性。

8. 扩展性与高可用性

随着数据量的增长,扩展性和高可用性成为了数据库系统设计的重要考虑因素。在本节中,我们将介绍 PostgreSQL 的扩展性策略,包括读写分离和分片等方法,并提供实现高可用性的选项,如流复制、逻辑复制和自动故障转移等。

读写分离

为了应对高并发读写请求,PostgreSQL支持读写分离技术。通过将读操作和写操作分离到不同的数据库实例,可以减轻主数据库的负载,并提高读取性能。

分片

当单个数据库无法满足数据存储和查询的需求时,可以考虑使用分片技术。分片将大表拆分为多个子表,并将这些子表分布在不同的数据库节点上,从而实现数据的横向扩展。

流复制和逻辑复制

为了实现高可用性,PostgreSQL支持流复制和逻辑复制。流复制是将数据实时复制到多个备用数据库节点,从而在主数据库发生故障时,自动切换到备用节点。逻辑复制

则可以选择性地复制特定数据表或数据集合,提供更灵活的数据复制和同步选项。

自动故障转移

为了确保数据库系统的高可用性,自动故障转移是一种重要的实践方法。通过使用自动故障转移工具,如Patroni或Pacemaker,可以实现在主数据库发生故障时,自动将备用节点提升为主节点,从而实现数据库的自动切换和恢复。

通过合理规划和选择扩展性和高可用性的策略,数据库管理员可以确保 PostgreSQL 数据库能够随着业务需求的增长而持续稳定地运行。同时,高可用性的设计还能最大程度地减少数据库系统的宕机时间,保障数据的可靠性和一致性。

9. 性能调优与监控

性能调优是确保 PostgreSQL 数据库高效运行的关键步骤。在本节中,我们将提供一些性能调优的一般原则和技巧,帮助您优化数据库性能。同时,我们还将推荐一些常用的性能监控工具和技术,帮助管理员及时发现和解决性能问题。

性能调优原则与技巧

  1. 索引优化:合理创建索引可以显著提高查询性能。评估数据库的查询模式,选择适当的字段作为索引,并避免过多或不必要的索引,以减少维护开销。

  2. 查询优化:审查查询语句,确保使用高效的查询语法和 JOIN 操作,避免不必要的子查询或全表扫描。

  3. 内存管理:增加 PostgreSQL 的共享缓存大小,充分利用系统的内存资源,减少磁盘 I/O,提高查询性能。

  4. 参数调整:根据实际硬件和工作负载,调整 PostgreSQL 的配置参数,如并发连接数、查询缓存等,以获得最佳性能。

  5. 数据分区:对大型表进行分区,将数据分散到不同的表空间,提高查询效率和数据维护的灵活性。

性能监控工具与技术

  1. pg_stat_statements:这个扩展可以监控查询的执行情况,包括执行次数、平均执行时间等,帮助识别慢查询。

  2. pg_stat_activity:这个视图可以查看当前活跃的数据库会话和查询信息,帮助管理员及时发现并解决连接问题。

  3. pgBadger:这是一个用于解析 PostgreSQL 日志文件并生成报告的工具,可以帮助管理员追踪数据库的性能情况。

  4. pg_top:这是一个类似于Unix的top命令的工具,可以实时监控 PostgreSQL 数据库的活动情况。

  5. PostgreSQL自带日志:开启 PostgreSQL 的日志记录功能,可以记录数据库的查询和错误信息,帮助管理员进行故障排查和性能分析。

性能监控是 PostgreSQL 数据库维护的重要组成部分。通过使用这些工具和技术,管理员可以及时了解数据库的性能表现,发现潜在的性能问题,并进行相应的优化和调整。

10. 结论

在本博客中,我们深入理解了 PostgreSQL 的架构和内部工作原理。从概述 PostgreSQL 架构到连接和会话管理、查询处理与执行、事务管理与并发控制、存储引擎与物理存储结构、日志与恢复、扩展性与高可用性,每个主题都为我们揭示了 PostgreSQL 数据库的重要特性和机制。

深入理解这些原理有助于管理员更好地管理和优化 PostgreSQL 数据库,确保其高效稳定地运行。通过遵循性能调优原则和技巧,合理配置数据库参数,优化查询和索引,以及使用性能监控工具,管理员可以保持对数据库性能的持续关注,及时发现和解决性能问题,从而使 PostgreSQL 数据库成为高效可靠的数据存储平台。

希望本博客对您深入了解 PostgreSQL 并优化数据库性能有所帮助。继续学习和实践,将能够进一步掌握 PostgreSQL 的高级特性,并在实际应用中发挥其强大功能。祝您在 PostgreSQL 的学习和应用中取得成功!

11. 参考文献

在本博客的写作过程中,我们参考了以下相关书籍、文章和官方文档链接,推荐给读者进一步深入学习:

  • PostgreSQL官方文档
  • 《PostgreSQL 9 高级内核》- 刘铁岩
  • 《PostgreSQL 权威指南》- 安格尔 (Angulo)
  • 《PostgreSQL技术内幕》- 张文博

希望这篇博客能够帮助您更好地理解 PostgreSQL 的架构和内部工作原理,并在实践中应用这些知识来优化和管理您的数据库系统。祝您学习愉快!

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]


本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML渐变效果:线性渐变与径向渐变详解

简介 在HTML中,你可以使用CSS来创建渐变效果,给元素添加丰富的背景样式。本文将详细介绍HTML中的渐变效果,并提供示例代码帮助你理解和应用。 线性渐变(Linear Gradient) 线性渐变通过沿一条直线给元素应用颜色的渐变效果。你可以定义起始点和结束点之间的颜色过渡方式。…

西门子plc的通信联网不同网段通讯

你是否曾经遇到过需要将不同品牌的PLC数据进行交换的情况?今天我们要介绍的就是远创智控YC8000-PN的ModbusTCP客户机功能,它可以帮助你实现这一需求。 1, 远创智控YC8000-PN的lan1口连接西门子S7-1200的网口,FX5U自带以太网口与远创智控YC8…

JVM-Java虚拟机

JVM——Java虚拟机,是Java实现平台无关性的基石。 基本概念:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与…

linux中cgroup的简单使用

文章目录 1 简介1.1 主要功能1.2 cgroups子系统 2 绑定进程到指定cpu核数3 限制进程cpu使用率3.1 示例13.2 示例2 4 限制内存使用量5 限制磁盘读取速度 1 简介 Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与…

fastadmin 项目gitee管理

gitee创建一个仓库使用sourcetree等工具拉取代码使用phpstorm远程同步代码到本地设置忽略代码文件 注意:如果是直接把远程代码同步到本地,默认是你在 .gitignore中设置是无效的,代码一样会提交,需要先使用上面的截图去掉缓存&…

进程控制学习笔记

文章目录 进程退出孤儿进程僵尸进程进程回收waitpid()函数 进程退出 子进程的退出需要父进程对其资源的释放,子进程只能对用户区的数据进行释放,无法完成对内核区的释放。 可以获取到。 两个退出的区别: 系统调用不会刷新缓冲区&#xff…

【人工智能】神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵(Cross Entropy)…

html input 展示隐藏的密码

<!DOCTYPE html> <html> <meta http-equiv"Content-Type" content"text/html;charsetutf-8"/> <body><h2>登录表格</h2><form action"/action_page.php"><div class"container"><…

vue3-element-plus,控制表格多选的数量

1. 需求描述 控制表格的多选&#xff0c;最多只能选择5条数据&#xff0c;并且其他项禁用 2. 需求描述 <!-- selection-change 当选择项发生变化时会触发该事件--><template><el-tableref"multipleTableRef"v-loading"loading":data"…

微服务基础理论

微服务简介 微服务Microservices之父&#xff0c;马丁.福勒&#xff0c;对微服务大概的概述如下&#xff1a; 就目前而言&#xff0c;对于微服务业界并没有一个统一的、标准的定义&#xff08;While there is no precise definition of this architectural style ) 。但通在其…

flutter开发实战-build编译macos环境可安装dmg

flutter开发实战-build编译macos环境可安装dmg 之前开发中需要变异Macos成dmg的需求&#xff0c;这里记录一下build编译macos环境可安装dmg的过程。 一、工程目录 目录如下 如果工程没有macos&#xff0c;需要增加macos支持的平台。命令 flutter create --platformswindo…

Python爬虫+数据可视化:分析唯品会商品数据

目录 前言数据来源分析1. 明确需求2. 抓包分析&#xff1a;通过浏览器自带工具: 开发者工具 代码实现步骤: 发送请求 -> 获取数据 -> 解析数据 -> 保存数据发送请求解析数据保存数据 数据可视化先读取数据泳衣商品性别占比商品品牌分布占比各大品牌商品售价平均价格各…

华为数通HCIP-ISIS基础

IS-IS的基本概念 isis&#xff08;中间系统到中间路由协议&#xff09; 链路状态路由协议、IGP、无类路由协议&#xff1b; IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似:运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建…

每日一道面试题之HashSet的实现原理~

HashSet是Java中的一个集合类&#xff0c;它实现了Set接口(如下所示为源码)&#xff0c;它用于存储不重复的元素。HashSet的实现原理主要基于哈希表&#xff08;Hash Table&#xff09;&#xff0c;其内部使用了一个HashMap来存储元素&#xff0c;其数据存储结构是数组链表。在…

数学建模学习(1):Matlab函数

逻辑基础 1.逻辑变量 Logical类型: true(真值); false(假值) atrue bfalse 2.逻辑判定 数字逻辑&#xff1a; 常用的特殊逻辑&#xff1a; 3.逻辑运算 交叉知识-扩充优先级 优先级 符号 1&#xff08;最高&#xff09; 括号( ) 2 转置 ’ &#xff1b;次幂 ^ 3 一元…

svo1论文

SVO: Fast Semi-Direct Monocular Visual Odometry 摘要 我们提出了一种半直接单目视觉测距算法&#xff0c;该算法精确、鲁棒且比当前算法更快最先进的方法。半直接方法为运动估计技术消除了需要高成本的特征提取和鲁棒匹配。我们的算法可直接在像素强度上处理&#xff0c;以…

【C++初阶】---C++入门篇

文章目录 前言&#x1f31f;一、C历史介绍&#x1f31f;二、命名空间&#x1f30f;2.1.C与C对比&#x1f30f;2.2.命名空间的引入&#x1f30f;2.3.命名空间定义&#x1f30f;2.4.命名空间的使用&#x1f30f;2.5.对上述C与C对比中的第二个不同点的解释&#xff1a; &#x1f3…

基于有序模式的度量对多变量时间序列进行非线性分析研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 基于有序模式的度量&#xff08;Ordinal Pattern-based Measures&#xff09;是一种用于多变量时间序列非线性分析的方法。它可以通过分析时间…

【C++】医学影像PACS管理系统源码支持三维图像后处理和重建

前言&#xff1a;随着计算机科学与医疗设备的迅猛发展&#xff0c;数字化图像技术与现代通讯及计算机技术相结合&#xff0c;形成了PACS (picture archiving and communication system影像储存与传输系统)。它将医学图像资料转化为数字信息通过高速计算机设备及通讯网络&#x…

剑指offer51.数组中的逆序对

用类似于归并排序的方法解决这道题&#xff0c;把数组分成左右两个数组&#xff0c;然后归并排序&#xff0c;在排序的过程中统计逆序对的个数 class Solution {int[] nums, tmp;public int reversePairs(int[] nums) {this.nums nums;tmp new int[nums.length];return merge…