16.多字段索引、唯一索引、表达式上的索引、部分索引

本文详细介绍了PostgreSQL中四种类型的索引:1) 多字段索引,适用于联合查询,提高查询效率;2) 唯一索引,用于保证字段或字段组合的唯一性;3) 表达式上的索引,支持基于计算结果的快速访问;4) 部分索引,仅针对满足特定条件的表子集建立,节省存储空间和提升查询速度。文章探讨了各种索引的适用场景、优缺点以及使用技巧。
摘要由CSDN通过智能技术生成

       索引是提高数据库性能的常用方法。索引可以令数据库服务器以比没有索引快得多的速度查找和检索特定的行。不过索引也在总体上增加了数据库系统的负荷,因此我们应该恰当地使用它们。

1.多字段索引

一个索引可以定义在表中多个字段上。比如下面这样的表(把 /dev 目录保存在一个数据库里):

CREATE TABLE test2 (
  major int,
  minor int,
  name varchar
);

并且你经常做下面这样的查询:

SELECT name FROM test2 WHERE major = constant AND minor = constant;

那么在字段 major 和 minor 上联合定义一个索引是比较合适的做法,也就是:

CREATE INDEX test2_mm_idx ON test2 (major, minor);

目前,只有 B-tree 和 GiST 支持多字段索引。缺省最多可以声明 32 个字段(这个限制可以在编译 PostgreSQL 时改变,见 pg_config_manual.h 文件)。

一个多字段的 B-tree 索引可以用在包含索引字段子集的查询条件里,不过,如果在前导字段(最左边)上有约束条件,那么效率最高。准确的规则是前导字段上的等于约束,加上第一个没有等于约束的非等于约束字段,将用于限制所扫描的索引范围。将检查这两个字段右边字段上的索引以减少对表的访问,但是并不减少需要扫描的索引。比如,假如我们有一个在 (a, b, c) 上的索引,查询条件是 WHERE a = 5 AND b >= 42 AND c < 77 ,那么索引就需要先扫描所有 a = 5 且 b = 42 ,直到所有 a = 5 的记录扫描完毕。那些 c >= 77 的索引条目将被忽略,但是他们仍然会被扫描。这个索引原则上仍然会被用于那些在 b 和/或 c 上有约束,但是在 a 上没有约束的查询,但是就必须扫描整个索引了。因此,在大多数这种情况下,优化器会选择顺序扫描表,而不使用索引。

一个多字段的 GiST 索引只能用于那些在前导字段上有查询条件的查询中。附加字段上的条件会限制索引返回的条目,但是第一个字段上的条件是决定需要扫描多少索引内容的最重要的字段。如果在第一个字段上只有很少的一些唯一的数值,那么 GiST 就相对来说不那么高效了,即使在附加字段上有许多独立的数值也如此。

当然,每个字段都必须和适合该索引类型的操作符一起使用;包含其它操作符的子句将不会被考虑。

使用多字段索引应该谨慎。在大多数情况下,在单字段上的索引就足够了,并且还节约时间和空间。除非表的使用模式非常固定,否则超过三个字段的索引

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值