2008-09-25 25 views

回答

29
  • 独特 - 该列担保唯一值(或一组列)在索引包括
  • 覆盖 - 包括所有在一个特定的查询中使用的(或一组查询的)列,允许数据库仅使用索引而不必实际查看表数据以检索结果
  • 集群 - 这是实际数据在磁盘上排序的方式,这意味着如果查询使用聚集索引来查找向上的价值观,它没有采取仰视不包含在索引中的任何数据的实际表行的额外步骤。
+2

thanx它对我有帮助4我也是 – Freelancer 2012-12-20 11:33:24

6

OdeToCode has a good article covering the basic differences

,因为它说的文章:

适当的索引对于大型数据库中的良好表现 至关重要。 有时你可以弥补一个良好的指数不佳 书面查询,但 可能很难弥补差 索引用再好的查询。

非常真实,如果你刚刚开始使用它,我会专注于聚集索引和复合索引,因为它们可能会成为你使用最多的索引。

6

我会添加一些索引类型的

位图 - 当你有不同的可能值非常低的数字,速度非常快,不会占用太多的空间

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

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

2

对于相同类型的索引,不同的数据库系统有不同的名称,因此请注意这一点。例如,在Oracle中称为“索引组织表”的SQL Server和Sybase称为“聚集索引”。

5

PostgreSQL允许部分索引,其中仅匹配谓词的行被索引。例如,您可能需要为客户表索引仅用于那些处于活动状态的记录。这可能看起来像:

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

如果索引多列,并且有许多不活跃的客户,这可能是在空间方面大赢(该指数将存储在更少的磁盘页),因此性能。打你需要的指标,至少指定谓词:

select name from customers where is_active is true; 
0

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

的语法与到PostgreSQL:

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

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

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

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

对于频繁的DML和日常查询,使用B树的OLTP系统。对于具有罕见DML和adhoc查询的OLAP系统,请使用位图。

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

+0

索引组合是位图索引的用例。 – Apocalisp 2008-09-27 19:25:24

1
  1. 独特
  2. 集群
  3. 非群集
  4. 列存储
  5. 指数无线个包括列
  6. 指数的计算列
  7. 过滤
  8. 空间
  9. XML
  10. 全文
相关问题