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.rhkb.cn/news/366939.html

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

相关文章

静态IP代理:保障网络稳定的核心技术

静态IP代理作为一种重要的网络工具,因其稳定性和持久性,受到越来越多用户的青睐。本文将深入探讨静态IP代理的定义和优势。 静态IP代理是什么? 静态IP代理是指在代理服务器中分配一个固定的IP地址,用户在使用过程中始终使用同一个…

【CSS in Depth 2 精译】2.2 em 和 rem + 2.2.1 使用 em 定义字号

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem ✔️ 2.2.1 使用 em 定义字号 ✔️2.2.2 使用 rem 设置字号 2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.…

linux和mysql基础指令

Linux中nano和vim读可以打开记事文件。 ifdown ens33 ifup ens33 关闭,开启网络 rm -r lesson1 gcc -o code1 code1.c 编译c语言代码 ./code1 执行c语言代码 rm -r dir 删除文件夹 mysql> show databases-> ^C mysql> show databases; -------…

面对全球新能源汽车合作发展创维汽车如何实现共赢

由全球新能源汽车合作组织(筹)主办、中国电动汽车百人会承办的首届全球新能源汽车合作发展论坛(GNEV2024)于6月27日,6月28日在新加坡金沙会议展览中心召开。创维汽车国际营销公司总经理齐奎源受邀参会并作出分享。 本届大会以推动全球新能源汽车产业协同发展与合作…

RK3568平台(USB篇)USB HID设备

一.USB HID设备简介 USB HID设备主要用于和计算机进行交互通信,典型的USB HID类设备包括USB键盘、USB鼠标、USB游戏手柄等等,这些都是日常生活中常见的设备。以USB接口的鼠标为例,打开计算机的“设备管理器”,可以在“鼠标和其他…

设计高并发秒杀系统:保障稳定性与数据一致性

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一. 系统架构设计 1. 系统架构图 二、 系统流程 三…

简单实现Anaconda/Miniforge虚拟环境的克隆和迁移

简单实现Anaconda/Miniforge虚拟环境的克隆和迁移 一、问题描述一、方式一:使用命令克隆二、方式二:直接复制粘贴 欢迎学习交流! 邮箱: z…1…6.com 网站: https://zephyrhours.github.io/ 一、问题描述 使用Anaconda…

昇思25天学习打卡营第7天|Pix2Pix实现图像转换

文章目录 昇思MindSpore应用实践基于MindSpore的Pix2Pix图像转换1、Pix2Pix 概述2、U-Net架构定义UNet Skip Connection Block 2、生成器部分3、基于PatchGAN的判别器4、Pix2Pix的生成器和判别器初始化5、模型训练6、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要…

无忧易售升级:产品视频翻译支持,拓宽全球市场边界

在电商内容营销迈入视频时代的今天,无忧易售ERP推出针对OZON、Wish、TikTok、Wildberries(野莓)四大平台的产品视频翻译功能,彻底打破语言壁垒,让全球卖家的商品故事,以更生动、更直观的方式,触…

Linux指定文件权限的两种方式-符号与八进制数方式示例

一、指定文件权限可用的两种方式: 对于八进制数指定的方式,文件权限字符代表的有效位设为‘1’,即“rw-”、“rw-”、“r--”,以二进制表示为“110”、“110”、“100”,再转换为八进制6、6、4,所以777代表…

如何寻找一个领域的顶级会议,并且判断这个会议的影响力?

如何寻找一个领域的顶级会议,并且判断这个会议的影响力? 会议之眼 快讯 很多同学都在问:学术会议不是期刊,即使被SCI检索,也无法查询影响因子。那么如何知道各个领域的顶级会议,并对各个会议有初步了解呢…

Redis主从复制、哨兵以及Cluster集群

目录 1.Redis高可用 2.Redis主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 ​3.Redis哨兵模式 3.1 哨兵模式概述 3.2 哨兵模式的作用 3.3 故障转移机制 ​3.4 主节点的选举 3.5 搭建Redis哨兵模式 4. Redis 群集模式 4.1 Redis集群的数据分…

VS2022+Qt+OpenCV Debug模式下,循环中格式转换引起的内存异常问题 debug_heap.cpp

文章目录 前言一、问题二、报错1.提示图片2.提示堆栈3.反汇编位置 三、解决办法总结 前言 最近在使用VS2022,C,OpenCV,Qt开发时,遇到了一个疑难杂症-在循环中执行字符串格式转换会触发内存异常,经过痛苦的排查过程&am…

python自动化运维--DNS处理模块dnspython

1.dnspython介绍 dnspython是Pyhton实现的一个DNS工具包,他几乎支持所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同事支持TSIG(事物签名)验证消息和EDNS0(扩展DNS)。在系统管理方面&a…

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本,文本数据处理的核心是做tokenization,将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理,OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…

认识一下HttpMessageHandler处理管道

[S1208]HttpClient的默认管道结构 接下来我们通过如下的演示程序使用IHttpClientFactory工厂创建了 一个HttpClient对象,并查看其管道依次由哪些类型的HttpMessageHandler对象组成。如代码片段所示,我们定义了一个辅助方法PrintPipeline方法以递归的形式…

C++ ariac2 Windows库编译

cd "F:\\aria2" gmp-6.1.2.tar.lz expat-2.2.0.tar.bz2 sqlite-autoconf-3160200.tar.gz zlib-1.2.11.tar.gz c-ares-1.12.0.tar.gz libssh2-1.8.0.tar.gz --enable-libaria2 --enable-static libgnutls-dev(对于HTTPS,BitTorrent&#xff0…

vue+js实现鼠标右键页面时在鼠标位置出现弹窗

首先是弹窗元素 <div class"tanchuang move-win1"id"tanchuang1"><el-button>111</el-button></div>然后在需要弹窗的地方监听点击事件&#xff0c;可以将这个方法写在页面载入事件中 // 获取弹窗元素 var tanchuang document.…

【开发篇】明明配置跨域声明,为什么却仍可以发送HTTP请求

一、问题 在SpringBoot项目中&#xff0c;明确指定仅允许指定网站跨域访问&#xff1a; 为什么开发人员却仍旧可以通过HTTP工具调用接口&#xff1f; 二、为什么 在回答这个问题之前&#xff0c;我们首先要了解一下什么是CORS&#xff01; 1、什么是CORS CORS的全称为跨域资源…

springcloud-config服务器,同样的配置在linux环境下不生效

原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容&#xff0c;然后开始了远程调试&#xff0c;这里顺带讲解下获取配置文件如果使用的是Git源&#xff0c;config service是如何响应接口并返回配置信息的。先说问题&#xff0c;我的服务名原本是abc-abc-abc…