PostgreSQL 索引管理

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

前言

索引是关系型数据库离不开的话题,它是数据库中一种快速查询数据的方法。在 SQL 优化中,创建高性能的索引非常重要,本篇文章将对比 MySQL 介绍 PostgreSQL 的索引管理。

1. 主键

1.1 MySQL innodb 中的主键

MySQL 中的主键也叫聚簇索引,按照主键字段组织 B+ tree 叶子节点存储的是完整的行数据,就是说 MySQL 中的主键索引存储了一张表完整的数据。

那如果用户没有指定主键会如何呢?因为 MySQL Innodb 引擎很多内部机制都会用到主键,所以即使用户没有指定主键,引擎内部会使用隐藏 row_id 作为主键,用户不可见。

PS:MySQL 8.0.30 版本推出 Generated Invisible Primary Key 特性,感兴趣可以看 这篇文章。

1.2 PostgreSQL 中的主键

在 PostgreSQL 中数据和索引是分开存储的,非聚簇索引,所有的索引都是辅助索引,主键在 PostgreSQL 中相当于一个唯一 not null 的约束。下方是官方文档对主键的描述:

Relational database theory dictates that every table must have a primary key. This rule is not enforced by PostgreSQL, but it is usually best to follow it.
关系型数据库理论上都会要求每一张表都要有一个主键,但 PostgreSQL 并未强制要求这一点,但最好遵循它。

2. PG 索引类型

2.1 B-tree 索引

该类型索引是我们最常用的索引,按照顺序存储数据,支持对数时间复杂度(O(logN))的搜索、插入、删除和顺序访问。功能上和 MySQL innodb 引擎相同,支持 等值、范围查询、NOT NULL 等 都可以使用 B-tree 索引,当然也可以优化排序。

除此之外 PostgreSQL 还给辅助索引提供 INCLUDE 的功能,来规避 “回表” 查询。下方查询使用 x = key 条件搜索,需要查 y 字段,如果给 x 字段创建单列索引的话,需要再访问一次主数据区,相当于 MySQL 中 “回表” 查询的概念,MySQL 中可以创建复合索引把两个字段都放到索引列中。

SELECT y FROM tab WHERE x = 'key';

PostgreSQL 除了也可以那样做外,还可以使用 INCLUDE 语法,将需要查询的列包含在索引树的叶子节点中,但是它不参与索引树的组织排序,单纯避免回表,对此字段额外存储,所以 INCLUDE 的语法使用场景比较苛刻。

CREATE INDEX tab_x_y ON tab(x) INCLUDE (y);

创建 B-tree 辅助索引,不需要额外指定关键字:

CREATE INDEX index_name ON table_name(column_name);

除此之外在创建索引时也可以指定索引 升/降 排序:

CREATE INDEX index_name ON table_name(column_name desc);

如果索引字段包含 NULL 值,也可以指定 NULL 值排在非空前面。FIRST 还是非空后面 LAST:

CREATE INDEX index_name ON table_name(column_name desc NULL FIRST);

2.2 HASH 索引

哈希索引(Hash index)只能用于简单的等值查找(=),也就是说索引字段被用于等号条件判断。因为对数据进行哈希运算之后不再保留原来的大小关系。

创建哈希索引需要使用 HASH 关键字:

CREATE INDEX index_name ON table_name USING HASH (column_name);

2.2 GiST 索引

GiST 索引并不是一种单独的索引,而是可以用于实现很多不同索引策略的基础设施。相应地,可以使用一个GiST索引的特定操作符根据索引策略(操作符类)而变化。

2.3 SP-GiST 索引

SP-GiST是 “Space Partitioned GiST” 的缩写,即空间分区 GiST 索引。它是从 PostgreSQL9.2 版本开始提供的一种新索引类型,主要是通过一些新的索引算法来提高 GiST 索引在某种情况下的性能。

2.4 GIN 索引

GIN 代表广义倒排索引(generalized inverted indexes),主要用于单个字段中包含多个值的数据,例如 hstore、array、jsonb 以及 range 数据类型。一个倒排索引为每个元素值都创建一个单独的索引项,可以有效地查询某个特定元素值是否存在。

2.5 BRIN 索引

BRIN 代表块区间索引(block range indexes),存储了连续物理范围区间内的数据摘要信息。BRIN 也相比于 B-树索引要小很多,维护也更容易。对于不进行水平分区就无法使用 B-树索引的超大型表,可以考虑 BRIN。

3. 索引管理语法

这里只讨论 B-tree 类型的索引维护。

3.1 创建唯一索引

CREATE UNIQUE INDEX index_name ON table_name (column_name [ASC | DESC] [NULLS FIRST | NULLS LAST]);

3.2 多列索引

PostgreSQL 支持创建多列索引,最大可指定 32 个字段,MySQL 最多可指定 16 个字段。

CREATE [UNIQUE] INDEX index_name ON table_name
[USING method]
(column1 [ASC | DESC] [NULLS FIRST | NULLS LAST], ...);

3.3 函数索引

例如,一种进行大小写不敏感比较的常用方法是使用 lower 函数:

SELECT * FROM test1 WHERE lower(col1) = 'value';

这种查询可以利用一个建立在 lower(col1) 函数结果之上的索引:

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

3.4 部分索引

PostgreSQL 可以给表中的部分数据创建索引,从而减少索引占用空间的大小,下面是一个例子:

-- 对于订单表 orders,绝大部的订单都处于完成状态
create table orders(order_id int primary key, order_ts timestamp, finished boolean);

-- 我们只需要针对未完成的订单进行查询跟踪,可以创建一个部分索引
create index orders_unfinished_index
on orders (order_id) where finished is not true;

3.5 覆盖索引

在之前 2.1 节有介绍,可以避免 “回表” 查询:

CREATE INDEX tab_x_y ON tab(x) INCLUDE (y);

3.6 查看索引

select * from pg_indexes where tablename = 'pgbench_accounts';
-[ RECORD 1 ]--------------------------------------------------------------------------------------
schemaname | public
tablename  | pgbench_accounts
indexname  | pgbench_accounts_pkey
tablespace | 
indexdef   | CREATE UNIQUE INDEX pgbench_accounts_pkey ON public.pgbench_accounts USING btree (aid)

也可以使用 \d 表名,也包含索引信息。

3.7 重命名索引

ALTER INDEX index_name RENAME TO new_name;

3.8 重建索引

ALTER INDEX index_name REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM }  index_name;

3.9 删除索引

DROP INDEX index_name [ CASCADE | RESTRICT ];

CASCADE 表示级联删除其他依赖该索引的对象;RESTRICT 表示如果存在依赖于该索引的对象,将会拒绝删除操作。默认为 RESTRICT。

后记

Reference:文章来源地址https://www.toymoban.com/news/detail-514067.html

  • PostgreSQL b-tree 索引分析
  • PostgreSQL Constraints
  • https://www.postgresql.org/docs/current/indexes-types.html

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

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

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

相关文章

  • 关系型数据库与非关系型数据库类比

    关系型数据库和非关系型数据库都有多种不同类型,每种类型都针对不同的数据存储需求和使用场景。以下是一些常见的关系型数据库和非关系型数据库类型: 关系型数据库类型: MySQL: 一种开源的关系型数据库管理系统,用于处理结构化数据,适用于各种规模的应用。

    2024年02月11日
    浏览(40)
  • 关系型和非关系型数据库的区别

    关系型数据库,是指采用了关系模型来组织数据的数据库,关系型数据库的最大特点就是事务的一致性。关系型数据天然就是表格式的,因此数据存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。 优点 易于维护:都是使用表结构,格式一致。 使

    2024年02月13日
    浏览(89)
  • 重学MySQL之关系型数据库和非关系型数据库

    1.1 关系型数据库的特性 1.1.1 事务的特性 事务,是指一个操作序列,这些操作要么都执行,或者都不执行,而且这一序列是无法分隔的独立操作单位。也就是符合原子性(Atomicity)、 一致性(Consistency)、 隔离性(Isolation)和持久性(Durability)的一组操作。 原子性:指一个

    2024年02月02日
    浏览(72)
  • 关系型非关系型数据库区别,以MongoDB为例在express中连接MongoDB示例

    目录 关系型数据库 关系型数据库常见的类型有: 关系型数据库的优点包括: 非关系型数据库 非关系型数据库常见的类型有: 非关系型数据库的特点包括: 关系型数据库和非关系型数据库区别 MongoDB是什么 MongoDB优势: 在Express中连接MongoDB步骤 Schema 关系型数据库是以关系模

    2024年01月16日
    浏览(77)
  • 非关系型数据库

    一、什么是非关系型数据库? 随着互联网的飞速发展,人们对数据存储和管理的需求越来越高,传统的关系型数据库遇到了越来越多的挑战。为了满足海量数据存储和高性能查询的需求,非关系型数据库(NoSQL)应运而生。 非关系型数据库是指不使用关系模型进行数据组织和

    2024年02月07日
    浏览(48)
  • 关系型数据库设计

    目录 1.数据库设计的重要性及定义 1.1 数据库设计的重要性 1.1.1 失败的数据库设计造成的后果  1.1.2 优秀的数据库设计带来的好处  1.2 数据库设计的定义  2.数据库需求分析  2.1 需求分析的步骤 2.1.1 收集信息 2.1.2 标识实体 2.1.3 标识每个实体的详细信息  2.1.4 标识实体之

    2024年04月10日
    浏览(65)
  • 数据库介绍-非关系型数据库

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。 NoSQL 不依赖业务逻辑方式存储,数据存储的类型不需要一个固定形式。因此大大的增加了数据库的扩展能力。 不遵循 SQL 标准 不支持 ACID 远超于 SQL 的性能 易扩展 大读写量,高性能 数据模型灵活 高可用

    2024年02月16日
    浏览(53)
  • Elasticsearch与关系型数据库集成

    Elasticsearch是一个开源的搜索和分析引擎,基于Lucene库开发,具有高性能、可扩展性和实时性等特点。关系型数据库则是一种结构化数据库管理系统,以表格形式存储数据,支持SQL查询语言。在现实应用中,Elasticsearch与关系型数据库往往需要进行集成,以实现更高效、灵活的

    2024年02月20日
    浏览(72)
  • Redis_非关系型数据库

    也叫Not Only SQL(不仅仅是SQL, 不用 sql语言操作的数据库), 一般指 非关系型数据库 关系型数据库: 以数据库表为单位存储,表与表之间存在某种关系 非关系型数据库: 数据与数据之间没有关系, 数据就是以键值对的形式存储, 通过键获取到值 在互联网发展中: 大致经历三个时期,w

    2024年02月16日
    浏览(39)
  • MySQL——性能优化与关系型数据库

    吞吐与延迟:有些结论是反直觉的,指导我们关注什么。 没有量化就没有改进:监控与度量指标,指导我们怎么去入手。 80/20原则:先优化性能瓶颈问题,指导我们如何去优化。 过早的优化是万恶之源:指导我们要选择优化的时机。 脱离场景谈性能都是耍流氓:指导我们对

    2024年02月01日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包