32

有哪些不同类型的索引,每种索引的好处是什么?

我听说过覆盖索引和聚集索引,还有更多吗?你会在哪里使用它们?

4

11 回答 11

31
  • 唯一 - 保证索引中包含的列(或列集)的唯一值
  • 覆盖 - 包括在特定查询(或一组查询)中使用的所有列,允许数据库仅使用索引而实际上不必查看表数据来检索结果
  • 聚集 - 这是实际数据在磁盘上排序的方式,这意味着如果查询使用聚集索引来查找值,则不必采取额外步骤来查找任何数据的实际表行不包括在索引中。
于 2008-09-25T20:23:52.957 回答
7

OdeToCode 有一篇很好的文章,涵盖了基本的区别

正如文章中所说:

正确的索引对于大型数据库的良好性能至关重要。有时你可以用一个好的索引来弥补一个写得不好的查询,但即使是最好的查询也很难弥补糟糕的索引。

也确实如此……如果您刚开始使用它,我将专注于聚集索引和复合索引,因为它们可能是您最常使用的索引。

于 2008-09-25T20:13:50.830 回答
6

我将添加几个索引类型

BITMAP - 当您的不同可能值数量非常少时,速度非常快且不占用太多空间

PARTITIONED - 允许基于某些属性对索引进行分区,这些属性通常对非常大的数据库对象有利,因为存储或性能原因。

FUNCTION/EXPRESSION 索引 - 用于根据表预先计算一些值并将其存储在索引中,一个非常简单的示例可能是基于 lower() 或子字符串函数的索引。

于 2008-09-25T20:16:14.943 回答
5

PostgreSQL 允许部分索引,其中只有匹配谓词的行才被索引。例如,您可能希望仅为那些活动的记录索引客户表。这可能看起来像:

create index i on customers (id, name, whatever) where is_active is true;

如果您的索引很多列,并且您有很多不活跃的客户,那么这在空间(索引将存储在更少的磁盘页面中)和性能方面可能是一个巨大的胜利。要达到索引,您至少需要指定谓词:

select name from customers where is_active is true;
于 2008-09-25T21:29:18.667 回答
3

传统观点认为索引选择应该基于基数。他们会说,

对于像 GENDER 这样的低基数列,使用位图。对于像 LAST_NAME 这样的高基数,使用 b-tree。

这不是 Oracle 的情况,索引选择应该基于应用程序的类型(OLTP 与 OLAP)。具有位图索引的表上的 DML 可能会导致严重的锁争用。另一方面,Oracle CBO 可以轻松地将多个位图索引组合在一起,并且可以使用位图索引来搜索空值。作为基本规则:

对于具有频繁 DML 和例行查询的OLTP系统,请使用 btree。对于具有不频繁 DML 和即席查询的OLAP系统,请使用位图。

我不确定这是否适用于其他数据库,欢迎评论。以下文章进一步讨论了该主题:

于 2008-09-26T23:14:26.617 回答
2

不同的数据库系统对同一类型的索引有不同的名称,所以要小心。例如,SQL Server 和 Sybase 所称的“聚集索引”在 Oracle 中称为“索引组织表”。

于 2008-09-25T20:26:18.723 回答
2

我建议您搜索 Jason Massie ( http://statisticsio.com/ ) 和 Brent Ozar ( http://www.brentozar.com/ ) 的博客以获取相关信息。他们有一些关于处理索引的现实场景的帖子。

于 2008-09-25T20:27:21.967 回答
2

Oracle 具有 b 树、位图、分区和非分区、反向字节、位图连接和域索引的各种组合。

这是关于该主题的 11gR1 文档的链接:http: //download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

于 2008-09-25T21:36:32.457 回答
1
  1. 独特
  2. 非集群
  3. 列存储
  4. 包含列的索引
  5. 计算列上的索引
  6. 过滤
  7. 空间的
  8. xml
  9. 全文
于 2015-02-22T17:54:45.803 回答
0

SQL Server 2008 有过滤索引,类似于 PostgreSQL 的部分索引。两者都允许在索引中仅包含与指定条件匹配的行。

语法与 PostgreSQL 相同:

create index i on Customers(name) where is_alive = cast(1 as bit);
于 2008-09-26T22:19:53.440 回答
0

要查看索引的类型及其含义,请访问: https ://msdn.microsoft.com/en-us/library/ms175049.aspx

于 2016-09-14T11:57:07.143 回答