有哪些不同类型的索引,每种索引的好处是什么?
我听说过覆盖索引和聚集索引,还有更多吗?你会在哪里使用它们?
正如文章中所说:
正确的索引对于大型数据库的良好性能至关重要。有时你可以用一个好的索引来弥补一个写得不好的查询,但即使是最好的查询也很难弥补糟糕的索引。
也确实如此……如果您刚开始使用它,我将专注于聚集索引和复合索引,因为它们可能是您最常使用的索引。
我将添加几个索引类型
BITMAP - 当您的不同可能值数量非常少时,速度非常快且不占用太多空间
PARTITIONED - 允许基于某些属性对索引进行分区,这些属性通常对非常大的数据库对象有利,因为存储或性能原因。
FUNCTION/EXPRESSION 索引 - 用于根据表预先计算一些值并将其存储在索引中,一个非常简单的示例可能是基于 lower() 或子字符串函数的索引。
PostgreSQL 允许部分索引,其中只有匹配谓词的行才被索引。例如,您可能希望仅为那些活动的记录索引客户表。这可能看起来像:
create index i on customers (id, name, whatever) where is_active is true;
如果您的索引很多列,并且您有很多不活跃的客户,那么这在空间(索引将存储在更少的磁盘页面中)和性能方面可能是一个巨大的胜利。要达到索引,您至少需要指定谓词:
select name from customers where is_active is true;
传统观点认为索引选择应该基于基数。他们会说,
对于像 GENDER 这样的低基数列,使用位图。对于像 LAST_NAME 这样的高基数,使用 b-tree。
这不是 Oracle 的情况,索引选择应该基于应用程序的类型(OLTP 与 OLAP)。具有位图索引的表上的 DML 可能会导致严重的锁争用。另一方面,Oracle CBO 可以轻松地将多个位图索引组合在一起,并且可以使用位图索引来搜索空值。作为基本规则:
对于具有频繁 DML 和例行查询的OLTP系统,请使用 btree。对于具有不频繁 DML 和即席查询的OLAP系统,请使用位图。
我不确定这是否适用于其他数据库,欢迎评论。以下文章进一步讨论了该主题:
不同的数据库系统对同一类型的索引有不同的名称,所以要小心。例如,SQL Server 和 Sybase 所称的“聚集索引”在 Oracle 中称为“索引组织表”。
我建议您搜索 Jason Massie ( http://statisticsio.com/ ) 和 Brent Ozar ( http://www.brentozar.com/ ) 的博客以获取相关信息。他们有一些关于处理索引的现实场景的帖子。
Oracle 具有 b 树、位图、分区和非分区、反向字节、位图连接和域索引的各种组合。
这是关于该主题的 11gR1 文档的链接:http: //download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
要查看索引的类型及其含义,请访问: https ://msdn.microsoft.com/en-us/library/ms175049.aspx