PostgreSQL 性能优化与调优(六)

1. 索引优化

1.1 创建索引

索引可以显著提高查询性能。创建索引的基本语法如下:

CREATE INDEX index_name ON table_name (column_name);

例如,为 users 表的 username 列创建索引:

CREATE INDEX idx_username ON users (username);

1.2 常见索引类型

  • B树索引(B-Tree Index): 默认类型,适用于大多数情况。
  • 哈希索引(Hash Index): 适用于等值比较。
  • GIN 和 GiST 索引: 适用于全文搜索和复杂数据类型。
  • BRIN 索引(Block Range INdex): 适用于非常大的表和顺序访问的情况。

1.3 多列索引

多列索引可以同时加速涉及多列的查询:

CREATE INDEX idx_user_email ON users (username, email);

1.4 使用索引的注意事项

  • 避免为小表创建索引。
  • 谨慎使用太多索引,因为索引也会影响写性能。
  • 定期分析和维护索引,使用 VACUUMANALYZE 命令。

2. 查询优化

2.1 查询计划(EXPLAIN)

使用 EXPLAIN 命令查看查询的执行计划,找出潜在的性能问题:

EXPLAIN SELECT * FROM users WHERE username = 'alice';

2.2 常见优化技巧

  • 选择合适的索引: 确保查询使用了正确的索引。
  • *避免 SELECT 仅选择需要的列,减少不必要的数据传输。
  • 优化 JOIN 操作: 使用小表驱动大表,合理设计索引。
  • 减少子查询: 使用 JOIN 或 CTE(公用表表达式)替代复杂的子查询。

2.3 示例优化

优化前:

SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE age > 30);

优化后:

SELECT orders.* FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.age > 30;

3. 配置调优

3.1 调整配置参数

调整 PostgreSQL 配置文件(postgresql.conf)中的参数,以优化性能。

3.1.1 内存参数
  • shared_buffers: 用于缓存表和索引数据。通常设置为服务器内存的 25%。
  • work_mem: 用于临时操作的内存。适当调整以提高复杂查询的性能。
  • maintenance_work_mem: 用于维护操作(如VACUUM和CREATE INDEX)。可以临时提高此值以加快大规模维护操作。
3.1.2 并发参数
  • max_connections: 最大并发连接数。设置过高可能导致内存不足。
  • max_worker_processes: 最大后台工作进程数。适当增加以支持更多并行操作。
3.1.3 自动化维护
  • autovacuum: 自动清理和优化表。确保启用并根据需要调整频率。

3.2 监控与日志

配置日志记录和监控,以识别和诊断性能问题。

3.2.1 日志配置

postgresql.conf 中配置日志参数:

log_min_duration_statement = 1000   # 记录执行时间超过 1000 毫秒的查询
log_statement = 'all'               # 记录所有SQL语句
3.2.2 使用pg_stat_statements

安装并配置 pg_stat_statements 扩展,监控SQL查询的性能:

CREATE EXTENSION pg_stat_statements;-- 查询最耗时的SQL语句
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;

4. 并行查询与批处理

4.1 并行查询

PostgreSQL 支持并行查询,可以利用多核处理器提升查询性能。确保配置参数支持并行查询:

max_parallel_workers_per_gather = 4

4.2 批量操作

尽量使用批量操作替代逐条操作,以提高性能。

批量插入:

INSERT INTO users (username, email) VALUES 
('user1', 'user1@example.com'),
('user2', 'user2@example.com');

批量更新:

UPDATE users SET email = 'updated@example.com' WHERE username IN ('user1', 'user2');

5. 实战演练

5.1 练习题目

  1. orders 表创建适当的索引,以加速按用户和订单日期查询的操作。
  2. 使用 EXPLAIN 分析下列查询的执行计划并优化:
    SELECT * FROM orders WHERE user_id = 1 AND order_date > '2023-01-01';
    

  3. 调整 PostgreSQL 配置参数以优化内存使用和并发性能。
  4. 安装并使用 pg_stat_statements 扩展,识别最耗时的查询。

5.2 示例答案

  1. 创建索引:
CREATE INDEX idx_user_order_date ON orders (user_id, order_date);
  1. 使用 EXPLAIN 分析和优化:
EXPLAIN SELECT * FROM orders WHERE user_id = 1 AND order_date > '2023-01-01';-- 优化后(索引已创建)
SELECT * FROM orders WHERE user_id = 1 AND order_date > '2023-01-01';
  1. 调整配置参数:

postgresql.conf 文件中进行如下调整:

shared_buffers = 4GB
work_mem = 64MB
maintenance_work_mem = 1GB
max_connections = 200
max_worker_processes = 16
autovacuum = on
  1. 安装并使用 pg_stat_statements
CREATE EXTENSION pg_stat_statements;-- 查询最耗时的SQL语句
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;

系统文章目录:

PostgreSQL 简介与基础(一)

PostgreSQL 基本SQL语法(二)

PostgreSQL 高级SQL查询(三)

PostgreSQL 数据库设计与管理(四)

PostgreSQL 高级功能(五)

PostgreSQL 性能优化与调优(六)

PostgreSQL 高可用性与灾难恢复策略(七)

PostgreSQL 安全性与权限管理(八)

PostgreSQL 高级功能与扩展(九)

PostgreSQL 分区表与并行查询(十)

PostgreSQL 索引优化与性能调优(十一)

PostgreSQL 日志管理与故障排查(十二)

PostgreSQL 高可用性与容错性(十三)

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

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

相关文章

【VMware】VMware 开启的虚拟机无法联网的解决方案

目录 🌊1. 问题说明 🌊2. 解决方案 🌍2.1 查看虚拟网络编辑器 🌍2.2 设置 vmnet 🌍2.3 设置虚拟机网络 🌍2.4 Xshell连接虚拟机 🌊1. 问题说明 虚拟机 ping 其他网页显示失败,比如&#…

数据质量管理-时效性管理

前情提要 根据GB/T 36344-2018《信息技术 数据质量评价指标》的标准文档,当前数据质量评价指标框架中包含6评价指标,在实际的数据治理过程中,存在一个关联性指标。7个指标中存在4个定性指标,3个定量指标; 定性指标&am…

Linux内存管理--系列文章陆——可执行文件的装载

应届生面试时,经常会有人问程序和进程有什么区别。简单来讲,程序是一个静态物品,就是存放在磁盘上的一些预先编译好的指令和数据的文件。而进程是一种运行的实例,它是程序在操作系统中的一次运行活动,具有生命周期。进…

汇编语言中的内存管理与寻址方式

在计算机科学中,内存管理是确保程序和数据能够高效、安全地存储和访问的关键环节。汇编语言,作为最接近硬件的编程语言,为程序员提供了直接控制内存的能力。 内存管理基础 内存管理涉及到数据如何在内存中存储、访问和操作。在汇编语言层面…

创建一个快速、高效的网络爬虫:PHP和Selenium示例

随着互联网的不断发展,数据爬取已经成为了许多人的必备技能。而网络爬虫则是实现数据爬取的重要工具之一。 网络爬虫可以自动化地访问网站、获取内容、分析页面并提取所需数据。其中,Selenium是一款非常优秀的网络自动化测试工具,能够模拟真…

Window安全配置

任何本地登录的用户都属于Interactive组Ipconfig/all :用于显示所有网络适配器的完整TCP/IP配置信息route print:用于显示路由表中的当前项目tracert –d:禁止tracert将中间路由器的IP地址解析为名称。这样可以加速显示tracert的结果nslookup…

面向对象分析与设计

文章目录 设计的重点在于模块间的通信,而不在于模块的属性和方法程序就是一群对象,通过消息要求对方做点事情对象间相互协作(消息)以完成系统功能 设计的重点在于模块间的通信,而不在于模块的属性和方法 程序就是一群对象,通过消…

【旭日x3派】部署官方yolov5全流程

地平线旭日x3派部署yolov5--全流程 前言一、深度学习环境安装二、安装docker三、部署3.1、安装工具链镜像3.2、配置天工开物OpenExplorer工具包3.3、创建深度学习虚拟空间,安装依赖:3.4、下载yolov5项目源码并运行3.5、pytorch的pt模型文件转onnx3.6、最…

前端git约定式规范化提交-commitizen

当使用commitizen进行代码提交时,commitizen会提示你在提交代码时填写所必填的提交字段信息内容。 1、全局安装commitizen npm install -g commitizen4.2.4 2、安装并配置 cz-customizeable 插件 2.1 使用 npm 下载 cz-customizeable npm i cz-customizeable6.…

Spark SQL----Troubleshooting

Spark SQL----Troubleshooting JDBC驱动程序类必须对客户端会话和所有executor上的原始类加载器可见。这是因为Java的DriverManager类进行安全检查,导致它在打开连接时忽略所有原始类加载器不可见的驱动程序。一种方便的方法是在所有worker节点上修改compute_classp…

【论文复现】——基于LM优化的NDT点云配准算法

目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 1、论文概述 传统的正态分布变换配准算法处理初始位姿变换相…

办公软件WPS与Office的区别

临近计算机考试很多同学在纠结我是报wps好?还是ms office好?下面就来详细说说。 1、wps属于国内金山公司的办公软件,里面包含word、Excel和PPT。考试是2021年开始的! 2、MS(Microsoft 微软) office属于美…

AI产品经理面试

把优秀当习惯把优秀当习惯肯定不是口头说说,那有什么判断标准吗? 当我做完一件事儿的时候,我会看它有没有突破我的舒适圈、能不能惊艳到我自己。这就是我的判断标准。 在自我介绍和经历介绍时,面试者应该注重以下几个方面&#xf…

核方法总结(四)——高斯过程回归学习笔记

一、定义 基于核方法的线性回归模型和传统线性回归一样,可以用未知数据进行预测,但不能确定 预测的可信度。在参考书第二章中可知,基于贝叶斯方法可以实现对未知数据依概率预测,进而可得到预测的可信度。这一方法中,通…

爬虫是什么 | Python爬虫应该学习什么知识点?

什么是爬虫 如果说把互联网比喻成蜘蛛网,那么爬虫就是在这张网上的蜘蛛,它可以在上面爬来爬去。在互联网中,爬虫就是机器人,你应该对百度和 Google 很熟悉吧,为什么我们可以很快的从它们的搜索引擎中获取到资料呢&…

嵌入式Linux系统编程 — 4.7 regcomp、regexec、regfree正则表达式函数

目录 1 为什么需要正则表达式 2 正则表达式简介 3 正则表达式规则 4 regcomp、regexec、regfree函数 4.1 函数介绍 4.2 URL格式案例 1 为什么需要正则表达式 在许多的应用程序当中, 有这样的应用场景: 给定一个字符串,检查该字符串是否…

分布式锁及其实现与应用场景

分布式锁及其实现与应用场景 分布式锁是一种用于在分布式系统中协调多个进程或线程对共享资源进行访问的机制。它的主要目的是确保在同一时间只有一个进程或线程可以访问特定资源,从而避免数据竞争和不一致问题。分布式锁通常用于集群环境中,例如微服务…

Rpc服务的提供方(Rpcprovider)的调用流程

首先,服务的提供方,会通过rpcprovider向rpc服务方注册rpc服务对象和服务方法, 那么,我们通过protobuf提供的抽象层的service和method,将服务对象和它所对应的服务方法记录在map表中, 当它启动以后&#xff…

Qt之饼图(Pie Graph)

[TOC](Qt之饼图(Pie Graph)) 饼图名为Pie Graph,用于显示一个数据系列中各项的大小与各项总和的比例。本文基于QtCharts实现饼图的显示。 1.实现过程 1.1环境配置 (1)首先想要使用QtCharts模块,需要在安装qt时选择勾选安装QtCha…

使用SimpleDateFormat进行日期格式化

使用SimpleDateFormat进行日期格式化 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,处理日期和时间是一个常见且重要的任务。Java提…