PostgreSQL (七) 性能优化

这篇具有很好参考价值的文章主要介绍了PostgreSQL (七) 性能优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.SQL优化

1.1.SQL执行顺序

序号 顺序
1 FROM
2 ON
3 JOIN
4 WHERE
5 GROUP BY
6 HAVING
7 DISTINCT
8 ORDER BY
9 LIMIT

1.2.优化方案

序号 优化
1 尽量不使用子查询
2 索引的数量不宜过多, 每次新增或修改数据都会新建或修改索引, 消耗性能, 因此不要超过5个
3 尽量不要使用*查询所有字段, 否则索引失效
4 使用排序时, 尽量使用有索引字段
5 如果两张表没有重复数据, 则尽量使用union all, 而不是union
6 select * from 表A where id in (select id from 表B)select * from 表A where id exists (select id from 表B), 如果A表数据量大于B表, 则使用in, 反之使用exists
7 尽量使用数字型字段就不要使用字符类型,能使用小的类型就使用小的类型, varchar可以根据字符串长度自动调整, 金融类数字使用decimal
8 避免使用部分查询, 从而导致索引失效, 如: !=、<>、not in、not exists、not like、is null、is not null、or, 使用IN替代OR
9 LIKE 查询不要用%开头, 如: LIKE ‘%fra%’, 而使用LIKE ‘fra%’
10 不要在where的等于号左侧使用表达式和函数运算
11 order by的时候使用字段尽量在where条件的字段
12 多表查询时, 小表在前, 大表在后
13 尽量使用别名, 减少解析的时间
14 使用LIMIT M OFFSET N分页查询时, 如果数据量过大时, 可以使用where id > N LIMIT M
15 join表数量进来不要超过3个
16 查询时where条件尽量遵循索引最左前缀原则, 即: where查询的前几列条件字段对应索引的前几列

2.优化数据库结构

2.1.增加冗余字段

A和B两张表属于关联表, 其中B表的一个字段field_1, 经常被A表连表查询, 这样会减少查询速度, 尤其是在数据量较大的时候, 影响性能. 如果在这种类型字段不多情况下, 可以在A表中增加field_1字段, 避免连表查询.
缺点: 当B表中field_1字段发生改变时, 就要同时改变其他表关于这个字端的冗余字段.

2.2.批量插入

2.2.1.SQL语句的选择

SQL1:

INSERT INTO table_name values(1, 'fracong1', 30);
INSERT INTO table_name values(2, 'fracong2', 31);
INSERT INTO table_name values(3, 'fracong3', 32);

SQL2:

INSERT INTO table_name values(1, 'fracong1', 30),(2, 'fracong2', 31),(3, 'fracong3', 32);

使用SQL2的速度要快于使用SQL1的速度.

2.2.2.删除索引/外键约束

索引的目的是为了加快查询速度, 每插入一条数据, 就会创建一个索引记录. 但在在插入大量数据的时候, 创建索引会极大的降低插入记录的速度. 这个时候, 可以先删除索引, 等到完全插入好数据之后, 再新建索引.
同理, 外键约束也是如此, 每次插入新的数据,都会去校验是否有外键约束, 这样也降低了插入速度.

2.2.3.使用COPY命令

可以参考之前我写的文章: Java使用Postgresql的Copy功能大量数据保存数据库
使用COPY语句导入数据的速度比使用INSERT插入数据的数度要快.

2.2.4.关闭自动提交

在允许自动独立提交时, 每插入一条数据数据, 就多了大量的事务记录, 降低了批量插入操作的速度.可以在插入前关闭自动提交, 在完成插入后, 恢复自动提交.

2.3.增加中间表

如果两个关联表查询次数较多, 可以考虑将两个表需要经常查询的字段, 集中在一个一张中间表上, 只需要查询中间表, 避免了连表查询.
缺点: 如果两张表发生变化, 这张中间表也要及时更新. 如果数据量过大, 也不要做中间表.

2.4.拆分表

以PostgreSQL为例, 最多的字段个数为1664个, 但不是说就可以建1664个, 字段越多, 查询的速度也会越慢. 通常情况下, 一张表的字段最大数量控制在20到50之间, 尽量小于20个.
如果一张表当中有部分字段属于不经常读取的字段, 可以将这部分的字段提取出来组成一个新表, 使用关联表的方式, 通过第一张表的ID查询不经常使用的字段.从而提高了第一张表查询速度.

3.优化硬件和参数

硬件方面: 一般公司不会采取优化, 因为成本过高. 不过也可以采取以下的优化: 使用较大内存, 配置高度磁盘系统, 合理分配磁盘I/O, 配置多处理器.

参数方面:
1.max_connections 最大连接数, 在内存分配合理的情况下, 配置越高的服务器, 尽可能配置多的连接数.
2.shared_buffers 缓冲区, 通常设置为10%到25%, 如果内存很大的话, 可以配置更大的缓冲区.
3.effective_cache_size 使用的最大缓存, 设置为50%为保守设置, 75%为正常设置, 该值是一个估计值, 并不占据内存.
4.work_mem: 单个连接用户使用的内存, 在使用的时候, 通常是work_mem * max_connections, 不要超过实际使用的内存.
当work_mem设置过小时, 排序的时候, 会生成几个临时文件进行结果集排序, 极大消耗性能, 速度较慢.
而设置稍大的work_mem后, 将不会生成临时文件,而是将结果集放在内存中进行比较排序, 这样可以提高性能.
5.maintenance_work_mem:主要会影响vacuum,analyze,create index,reindex等操作, 系统默认值通常为64MB, 如果上述操作比较频繁, 可以调高一点内存.
6.其他参数: wal_buffers、checkpoint_timeout、synchronous_commit、default_statistics_target、max_wal_size、min_wal_size、wal_sync_method、checkpoint_completion_target等.文章来源地址https://www.toymoban.com/news/detail-702337.html

到了这里,关于PostgreSQL (七) 性能优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PostgreSQL数据库命令行执行SQL脚本的三种方式

    生成环境中,出于安全性等原因,往往不提供数据库连接工具,所以对数据库的更新和升级就得通过命令行来实现。本文总结了三种命令行执行sql脚本的方式。 命令格式: psql [option…] [dbname] [username] 常用参数介绍: -h:指定IP地址或主机名。 -p:指定端口,默认为5432。 -U:

    2024年02月11日
    浏览(48)
  • PostgreSQL数据库——Docker版本的postgres安装 & Navicat连接方式+导入向导使用 & SpringBoot结合Jpa使用PostgreSQL初步

    1.PostgreSQL数据库初始,开源; 2.Docker版本的postgres安装,以及挂载启动; 3.Navicat连接方式+导入向导使用,导入csv文件; 4.SpringBoot结合Jpa使用PostgreSQL初步; PostgreSQL是一种开源的关系型数据库管理系统(RDBMS),它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是

    2024年02月04日
    浏览(58)
  • [运维|数据库] PostgreSQL数据库对MySQL的 READS SQL DATA 修饰符处理

    在 PostgreSQL 中,访问权限通常是通过数据库角色和表级别的权限进行管理,而不需要类似 MySQL 中的 READS SQL DATA 修饰符。 要在 PostgreSQL 中管理数据库对象的访问权限,您可以使用以下 SQL 命令: GRANT :授予用户或角色对表、视图等对象的特定权限。 REVOKE :撤销用户或角色对

    2024年02月07日
    浏览(58)
  • 如何在PostgreSQL中使用pg_stat_statements插件进行SQL性能统计和分析?

    PostgreSQL中的 pg_stat_statements 是一个强大的插件,用于追踪执行时间最长的SQL语句。通过它,我们可以获取有关SQL语句执行频率、总执行时间、平均执行时间等信息,从而进行性能调优和问题分析。 首先,我们需要确保 pg_stat_statements 插件已经安装。在大多数PostgreSQL发行版中,

    2024年04月25日
    浏览(58)
  • PostgreSQL数据库连接报错:psql: error: FATAL: password authentication failed for user “postgres“

    环境如下,使用yum方式安装PostgreSQL hostname IP地址 操作系统版本 PostgreSQL版本 jeven 192.168.3.166 centos 7.6 13.10 PostgreSQL(经常被简称为Postgres)是一个开源的关系型数据库管理系统,它基于SQL语言实现了所有主流功能,支持事务处理、并发控制、复杂查询、外键、触发器、存储过程

    2024年02月04日
    浏览(41)
  • 实例讲解C++连接各种数据库,包含SQL Server、MySQL、Oracle、ACCESS、SQLite 和 PostgreSQL、MongoDB 数据库

      C++ 是一种通用的编程语言,可以使用不同的库和驱动程序来连接各种数据库。以下是一些示例代码,演示如何使用 C++ 连接 SQL Server、MySQL、Oracle、ACCESS、SQLite 和 PostgreSQL、MongoDB 数据库。 连接 SQL Server 数据库 要使用 C++ 连接 SQL Server 数据库,可以使用 Microsoft 的 ADODB 库。以

    2024年02月05日
    浏览(49)
  • PostgreSQL (七) 性能优化

    序号 顺序 1 FROM 2 ON 3 JOIN 4 WHERE 5 GROUP BY 6 HAVING 7 DISTINCT 8 ORDER BY 9 LIMIT 序号 优化 1 尽量不使用子查询 2 索引的数量不宜过多, 每次新增或修改数据都会新建或修改索引, 消耗性能, 因此不要超过5个 3 尽量不要使用*查询所有字段, 否则索引失效 4 使用排序时, 尽量使用有索引字段

    2024年02月09日
    浏览(43)
  • PostgreSQL 性能优化: 等待事件

    等待事件是 PostgreSQL 的重要优化工具。当您能查明会话为什么在等待资源以及会话在做什么时,您就能更好地减少瓶颈。您可以使用本节中的信息来查找可能的原因和纠正措施。 目录 等待事件概述 BufferPin Client - ClientRead Client - ClientWrite CPU Extension IO - BufFileRead IO - BufFileWrit

    2024年02月03日
    浏览(26)
  • Postgresql SQL 字段拼接

    本文介绍Postgresql 数据库sql字段拼接的方法。 1.使用字符串连接函数 2.使用字符串连接操作符 使用 CONCAT() 函数将 pkey和 vname字段进行拼接 3.使用字符串拼接函数 使用 CONCAT_WS() 函数,其中第一个参数为拼接的分隔符(在示例中为’ \\\'),后续参数为要拼接的字段,以此将多个字

    2024年02月04日
    浏览(26)
  • PostgreSQL 使用SQL

    设置发布为true 这个语句是针对 PostgreSQL 数据库中的逻辑复制功能中的逻辑发布(Logical Publication)进行设置的。 PostgreSQL 中,逻辑复制是一种基于逻辑日志的复制方法,允许将数据更改从一个数据库实例复制到另一个数据库实例,而不是通过传统的物理复制方式复制数据文件

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包