有哪些不同类型的索引,每种索引的好处是什么?
我听说覆盖和聚集索引,还有更多吗?你会在哪里使用它们?
答案 0 :(得分:31)
答案 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)
答案 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