什么是不同类型的索引,每个索引的好处是什么?

时间:2008-09-25 20:12:26

标签: sql database database-design indexing

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

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

11 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分:7)

OdeToCode has a good article covering the basic differences

正如文章中所述:

  

适当的指数对善意至关重要   大型数据库中的性能。   有时你可以弥补一个不好的   带有良好索引的书面查询,但是   它可能很难弥补穷人   使用最好的查询进行索引。

也是如此......如果你刚刚开始使用它,我会专注于聚簇和复合索引,因为它们可能是你最常用的。

答案 2 :(得分:6)

我会添加几种索引类型

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

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

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

答案 3 :(得分:5)

PostgreSQL允许部分索引,其中只有与谓词匹配的行被索引。例如,您可能希望仅为那些处于活动状态的记录索引customer表。这可能类似于:

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

如果您的索引有很多列,并且您有许多非活动客户,那么就空间而言这可能是一个巨大的胜利(索引将存储在更少的磁盘页面中),从而提高性能。要命中索引,您至少需要指定谓词:

select name from customers where is_active is true;

答案 4 :(得分:3)

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

  

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

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

  

对于具有频繁DML和常规查询的 OLTP 系统,请使用btree。对于具有不常见的DML和adhoc查询的 OLAP 系统,请使用位图。

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

答案 5 :(得分:2)

不同的数据库系统对于相同类型的索引具有不同的名称,因此请小心。例如,在Oracle中调用SQL Server和Sybase称为“聚簇索引”的“索引组织表”。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

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

答案 8 :(得分:1)

  1. 唯一
  2. 非群集
  3. 专栏店
  4. 包含列的索引
  5. 计算列的索引
  6. 过滤
  7. 空间
  8. XML
  9. 全文

答案 9 :(得分:0)

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

语法与PostgreSQL相同:

create index i on Customers(name) where is_alive = cast(1 as bit);

答案 10 :(得分:0)

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