什么是不同类型的索引,每个索引的好处是什么?
我听说覆盖和聚集索引,还有更多吗?你会在哪里使用它们?
唯一 - 保证索引中包含的列(或列集)的唯一值
覆盖 - 包括在特定查询(或查询集)中使用的所有列,允许数据库仅使用索引,而实际上不必查看表数据以检索结果
Clustered - 这是在磁盘上对实际数据进行排序的方式,这意味着如果查询使用聚簇索引来查找值,则不必采取额外的步骤来查找任何数据的实际表行不包括在索引中.
OdeToCode有一篇很好的文章介绍了基本的差异
正如文章中所说:
适当的索引对于大型数据库中的良好性能至关重要.有时你可以用一个好的索引来弥补写得不好的查询,但即使是最好的查询,也很难弥补糟糕的索引.
也是如此......如果你刚开始使用它,我会专注于聚簇和复合索引,因为它们可能是你最常用的.
我将添加几种索引类型
BITMAP - 当你拥有非常少量的不同可能值时,非常快并且不会占用太多空间
PARTITIONED - 允许根据某些属性对索引进行分区,这些属性通常对非常大的数据库对象有利,这是出于存储或性能原因.
FUNCTION/EXPRESSION索引 - 用于根据表预先计算某些值并将其存储在索引中,一个非常简单的示例可能是基于lower()或子串函数的索引.
PostgreSQL允许部分索引,其中只有与谓词匹配的行被索引.例如,您可能希望仅为那些处于活动状态的记录索引customer表.这看起来像是这样的:
create index i on customers (id, name, whatever) where is_active is true;
如果您的索引有很多列,并且您有许多非活动客户,那么就空间而言这可能是一个巨大的胜利(索引将存储在更少的磁盘页面中),从而提高性能.要命中索引,您至少需要指定谓词:
select name from customers where is_active is true;