联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:15897897836 QQ:2106973531

PostgreSQL创建索引方式总结

在 PostgreSQL 中,创建索引是优化查询性能的重要手段。索引可以加快数据检索速度,但也会增加数据插入、更新和删除的开销。

1. 基本语法

CREATE INDEX index_name ON table_name (column_name);
  • index_name:索引的名称(可选,如果不指定,PostgreSQL 会自动生成一个名称)。

  • table_name:要创建索引的表名。

  • column_name:要创建索引的列名。

示例:

CREATE INDEX idx_users_email ON users (email);

2. 创建多列索引

可以在多个列上创建索引,以优化涉及这些列的查询。

CREATE INDEX index_name ON table_name (column1, column2, ...);

示例:

CREATE INDEX idx_users_name_email ON users (first_name, last_name, email);

3. 创建唯一索引

唯一索引确保索引列的值是唯一的。

CREATE UNIQUE INDEX index_name ON table_name (column_name);

示例:

CREATE UNIQUE INDEX idx_users_email_unique ON users (email);

4. 创建部分索引

部分索引只对满足特定条件的行创建索引,可以减少索引大小并提高性能。

CREATE INDEX index_name ON table_name (column_name) WHERE condition;

示例:

CREATE INDEX idx_users_active ON users (email) WHERE is_active = true;

5. 创建表达式索引

表达式索引基于列的计算结果创建索引。

CREATE INDEX index_name ON table_name (expression);

示例:

CREATE INDEX idx_users_lower_email ON users (LOWER(email));

6. 创建并发索引

在创建索引时,默认会锁定表以防止数据修改。使用 CONCURRENTLY 选项可以在不锁定表的情况下创建索引,但速度较慢。

CREATE INDEX CONCURRENTLY index_name ON table_name (column_name);

示例:

CREATE INDEX CONCURRENTLY idx_users_email ON users (email);

7. 创建全文索引

全文索引用于优化文本搜索查询。

CREATE INDEX index_name ON table_name USING GIN (column_name gin_trgm_ops);

示例:

CREATE INDEX idx_users_description ON users USING GIN (description gin_trgm_ops);

8. 创建空间索引(GiST)

GiST 索引用于优化空间数据查询。

CREATE INDEX index_name ON table_name USING GIST (column_name);

示例:

CREATE INDEX idx_locations_geom ON locations USING GIST (geom);

9. 创建哈希索引

哈希索引适用于等值查询,但不支持范围查询。

CREATE INDEX index_name ON table_name USING HASH (column_name);

示例:

CREATE INDEX idx_users_id_hash ON users USING HASH (id);

10. 创建 BRIN 索引

BRIN 索引适用于按顺序存储的大表,可以减少索引大小。

CREATE INDEX index_name ON table_name USING BRIN (column_name);

示例:

CREATE INDEX idx_logs_timestamp_brin ON logs USING BRIN (timestamp);

11. 删除索引

如果不再需要索引,可以使用以下命令删除索引:

DROP INDEX index_name;

示例:

DROP INDEX idx_users_email;

12. 查看索引

可以使用以下命令查看表的索引:

\dt+ table_name

或者查询系统表:

SELECT
    indexname,
    indexdef
FROM
    pg_indexes
WHERE
    tablename = 'table_name';

13. 索引类型对比

索引类型适用场景优点缺点
B-tree等值查询、范围查询、排序通用性强,支持多种查询索引较大
Hash等值查询查询速度快不支持范围查询
GiST空间数据、全文搜索支持复杂数据类型性能可能不如 B-tree
GIN全文搜索、数组查询支持多值查询索引较大
BRIN按顺序存储的大表索引小,适合大数据量查询性能可能不如 B-tree

14. 索引设计建议

  1. 选择合适的列:为经常用于查询条件、排序或连接的列创建索引。

  2. 避免过度索引:索引会增加写操作的开销,因此不要为所有列都创建索引。

  3. 使用部分索引:如果查询只涉及部分数据,可以使用部分索引减少索引大小。

  4. 监控索引性能:定期检查索引的使用情况,删除未使用的索引。

  5. 测试和优化:在生产环境中创建索引前,先在测试环境中验证其效果。


通过合理创建和使用索引,可以显著提升 PostgreSQL 数据库的查询性能。

相关文章

从安装PostgreSQL开始
通过以下步骤,你可以在 CentOS 7 上成功安装和配置 PostgreSQL 14。首先,设置 RPM 仓库并安装 PostgreSQL 14 服务器。然后,创建自定义数据存储目录并初始化数据库。接下来,修改启动脚本以使用自定义数据存储目录,并设置 PostgreSQL 监听所有 IP 地址。为了增强安全性,配置密码认证并修改 postgres 超级用户密码。最后,确保所有配置生效,重启 PostgreSQL 服务。通过这些步骤,你将拥有一个配置良好且安全的 PostgreSQL 数据库环境。如果在过程中遇到任何问题,请参考官方文档或寻求专业支持。
checkpoint是什么东西?一个位置?还是一个操作?
checkpoint是一个操作,执行这个操作的开始时刻,会记录当前开始时刻的 WAL 位置作为重做点,这个位置会被保存在文件中。 然后将该重做点之前所有 shared buffer 中的脏页均被刷入到存储。checkpoint又名检查点,一般checkpoint会将某个时间点之前的脏数据全部刷新到磁盘,以实现数据的一致性与完整性。
PostgreSQL 内参:深入解析运行原理【快照篇】
来源于灿哥的:《PostgreSQL 内参:深入解析运行原理》,非常好的一本书。
PG存在的级联删除(ON DELETE CASCADE)
在 PostgreSQL 中,如果你有两张表:用户表(users)和订单表(orders),并且用户表的主键是订单表的外键,那么你可以通过以下步骤来进行实验,删除订单表中的一条数据,然后删除用户表中的一条数据。

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册