当前位置: 首页 > news >正文

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 高可用性与容错性(十三)

相关文章:

PostgreSQL 性能优化与调优(六)

1. 索引优化 1.1 创建索引 索引可以显著提高查询性能。创建索引的基本语法如下: CREATE INDEX index_name ON table_name (column_name);例如,为 users 表的 username 列创建索引: CREATE INDEX idx_username ON users (username); 1.2 …...

win10 安装openssl并使用openssl创建自签名证书

win10创建自签名证书 下载安装配置openssl 下载地址: https://slproweb.com/download/Win64OpenSSL-3_3_1.exe https://slproweb.com/products/Win32OpenSSL.html 完成后安装,一路next,到达选位置的之后选择安装的位置,我这里选…...

【OpenCV 图像处理 Python版】图像处理的基本操作

文章目录 1.图像的 IO 操作1.1 图像读取 imread1.2 图像显示1.2.1 opencv 方式1.2.2 matplotlib 方式 1.3 图像保存 imwrite 2.绘制几何图形1. 绘制直线2. 绘制矩形3. 绘制圆形4. 绘制多边形5. 添加文字 3.获取并修改图像中的像素点3.1 获取像素值3.2 修改像素值3.3 获取和修改…...

HarmonyOS应用开发学习经验

一、HarmonyOS学习官网 开发者能力认证 HarmonyOS应用开发者基础认证6月之前的学习资源官网已经关闭过期,大家不要慌,官方更新了最新资源,但是,对于之前没有学习完的学员不友好,存在知识断片的现象,建议官…...

LLM大语言模型应用方案之RAG检索增强生成的实现步骤。

0.我理解的RAG 什么是RAG? RAG的全称是“检索增强生成模型”(Retrieval-Augmented Generation)。这是一种特别聪明的大语言模型。 RAG是怎么工作的呢? 1.检索:当你问RAG一个问题时,它会先去“图书…...

【python学习】学习python的小项目

学习Python时,通过完成一些小项目可以帮助你巩固知识并提升实践能力。以下是一些适合学习Python的小项目建议: 命令行计算器: 创建一个简单的命令行计算器,可以执行基本的算术运算(加、减、乘、除)。使用i…...

java-冒泡排序 1

## Java中的冒泡排序 ### 1. 冒泡排序的基本概念 冒泡排序(Bubble Sort)是一种简单且直观的排序算法。它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置,使较大的元素逐步从列表的一端移动到另一端,就像…...

【STM32】USART串口通讯

1.USART简介 STM32芯片具有多个USART外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写, 即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART, 它还有具有UART外设(Univers…...

Qt6中如何将QList转为QSet?

QSet是一个具有唯一值的哈希集合。比较少用。比较有用的是QSet里面的intersect查找两个集合中不同元素&#xff0c;并合并。 转换过程比较简单&#xff0c;第一种是直接用迭代器。 QSet<int> set(list.begin(), list.end()); 第二种就是逐一遍历赋值&#xff1a; QLi…...

aspectj:AOP编程备忘录-切面定义的注意事项

AOP编程时定义切面时需要注意的事 Around 以Around注解拦截构造方法(Constructor)时切面定义只能用call方式而不能是execution&#xff0c;否则 ProceedingJoinPoint.proceed()返回的是null&#xff0c;得不到构造的实例。 execution execution切入点要修改对象内部&#x…...

大数据面试题之Hive(1)

目录 说下为什么要使用Hive?Hive的优缺点?Hive的作用是什么? 说下Hive是什么?跟数据仓库区别? Hive架构 Hive内部表和外部表的区别? 为什么内部表的删除&#xff0c;就会将数据全部删除&#xff0c;而外部表只删除表结构?为什么用外部表更好? Hive建表语句?创建表…...

【Git】分布式版本控制工具

一、简介 二、目标 Git分布式版本控制工具 一、简介 Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理源代码的变化。它由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于2005年开发&#xff0c;并迅速成为最流行的版本控制工具之一。以下是关于Git的一些关键…...

排序之插入排序----直接插入排序和希尔排序(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…...

快速创建条形热力图

Excel中的条件格式可以有效的凸显数据特征&#xff0c;如下图中B列所示。 现在需要使用图表展现热力条形图&#xff0c;如下图所示。由于颜色有多个过渡色&#xff0c;因此手工逐个设置数据条的颜色&#xff0c;基本上是不可能完成的任务&#xff0c;使用VBA代码可以快速创建这…...

go switch 与 interface

go switch 与 interface 前言 前言 github.com/google/cel-go/common/types/ref type Val interface {// ConvertToNative converts the Value to a native Go struct according to the// reflected type description, or error if the conversion is not feasible.ConvertTo…...

BaseMapper 接口介绍

基于 mybatis-mapper/provider 核心部分实现的基础的增删改查操作&#xff0c;提供了一个核心的 io.mybatis.mapper.BaseMapper 接口和一个 预定义 的 io.mybatis.mapper.Mapper 接口&#xff0c;BaseMapper 接口定义如下&#xff1a; /*** 基础 Mapper 方法&#xff0c;可以在…...

HAL-Cubemax定时器使用记录

title: HAL-Cubemax定时器使用记录 tags: STM32HalCubemax 文章目录 HAL-Cubemax定时器使用记录分享一种思路1.创建一个ms(毫秒)级延时中断2.创建计数的变量3.在需要延时的函数中对变量阈值进行判断4.验证实例--完整使用记录代码 问题往期内容基础库HAL cubemax VSCODE GCC …...

同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?

在智能手机的世界里&#xff0c;续航能力一直是用户关注的焦点。苹果公司以其创新的MagSafe技术和传统的Lightning接口&#xff0c;为iPhone用户提供了多样化的充电解决方案。 然而&#xff0c;当这两种技术同时使用时&#xff0c;它们能否带来更快的充电速度&#xff1f;本文…...

零成本搭建个人图床服务器

前言 图床服务器是一种用于存储和管理图片的服务器&#xff0c;可以给我们提供将图片上传后能外部访问浏览的服务。这样我们在写文章时插入的说明图片&#xff0c;就可以集中放到图床里&#xff0c;既方便多平台文章发布&#xff0c;又能统一管理和备份。 当然下面通过在 Git…...

SpringBoot 搭建sftp服务 实现远程上传和下载文件

maven依赖&#xff1a; <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>application.yml sftp:protocol: sftphost: port: 22username: rootpassword: sp…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...