有哪些不同类型的索引,每种索引的好处是啥?
Posted
技术标签:
【中文标题】有哪些不同类型的索引,每种索引的好处是啥?【英文标题】:What are the different types of indexes, what are the benefits of each?有哪些不同类型的索引,每种索引的好处是什么? 【发布时间】:2010-09-13 05:43:51 【问题描述】:有哪些不同类型的索引,各有什么好处?
我听说过覆盖索引和聚集索引,还有更多吗?你会在哪里使用它们?
【问题讨论】:
【参考方案1】: 唯一 - 保证索引中包含的列(或列集)的唯一值 覆盖 - 包括在特定查询(或查询集)中使用的所有列,允许数据库仅使用索引,而实际上不必查看表数据来检索结果 聚集 - 这是实际数据在磁盘上排序的方式,这意味着如果查询使用聚集索引来查找值,则不必采取额外步骤来查找实际表行对于未包含在索引中的任何数据。【讨论】:
谢谢4对我也有帮助【参考方案2】:OdeToCode has a good article covering the basic differences
正如文章中所说:
正确的索引对于良好的效果至关重要 大型数据库中的性能。 有时候你可以弥补一个糟糕的 具有良好索引的书面查询,但是 可能很难弥补贫穷 索引甚至是最好的查询。
也确实如此...如果您刚开始使用它,我会专注于聚集索引和复合索引,因为它们可能是您最常使用的索引。
【讨论】:
【参考方案3】:我将添加几个索引类型
BITMAP - 当您的不同可能值数量非常少时,速度非常快且不占用太多空间
PARTITIONED - 允许基于某些属性对索引进行分区,出于存储或性能原因,这些属性通常对非常大的数据库对象有利。
FUNCTION/EXPRESSION 索引 - 用于根据表预先计算一些值并将其存储在索引中,一个非常简单的示例可能是基于 lower() 或子字符串函数的索引。
【讨论】:
【参考方案4】:PostgreSQL 允许部分索引,其中只有匹配谓词的行才被索引。例如,您可能希望仅为那些活动的记录索引客户表。这可能看起来像:
create index i on customers (id, name, whatever) where is_active is true;
如果您的索引有很多列,并且您有很多不活跃的客户,那么这在空间(索引将存储在更少的磁盘页面中)和性能方面可能是一个巨大的胜利。要达到您需要的索引,至少需要指定谓词:
select name from customers where is_active is true;
【讨论】:
【参考方案5】:传统观点认为索引选择应该基于基数。他们会说,
对于像 GENDER 这样的低基数列,使用位图。对于像 LAST_NAME 这样的高基数,请使用 b-tree。
Oracle 不是这种情况,索引选择应该基于应用程序的类型(OLTP 与 OLAP)。具有位图索引的表上的 DML 可能会导致严重的锁争用。另一方面,Oracle CBO 可以轻松地将多个位图索引组合在一起,并且可以使用位图索引来搜索空值。作为一般规则:
对于具有频繁 DML 和例行查询的 OLTP 系统,请使用 btree。对于具有不频繁 DML 和即席查询的 OLAP 系统,请使用位图。
我不确定这是否适用于其他数据库,欢迎使用 cmets。以下文章进一步讨论了这个主题:
Bitmap Index vs. B-tree Index: Which and When? Understanding Bitmap Indexes【讨论】:
索引组合是位图索引的用例。【参考方案6】:不同的数据库系统对同一类型的索引有不同的名称,所以要小心。例如,SQL Server 和 Sybase 所称的“聚集索引”在 Oracle 中称为“索引组织表”。
【讨论】:
【参考方案7】:我建议您搜索 Jason Massie (http://statisticsio.com/) 和 Brent Ozar (http://www.brentozar.com/) 的博客以获取相关信息。他们有一些关于处理索引的现实场景的帖子。
【讨论】:
【参考方案8】:Oracle 具有 b 树、位图、分区和非分区、反向字节、位图连接和域索引的各种组合。
这里是有关该主题的 11gR1 文档的链接:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
【讨论】:
【参考方案9】:-
独特
集群
非集群
列存储
包含列的索引
计算列上的索引
过滤
空间
xml
全文
【讨论】:
【参考方案10】:SQL Server 2008 有filtered indexes,类似于 PostgreSQL 的partial indexes。两者都允许在索引中仅包含符合指定条件的行。
语法与PostgreSQL相同:
create index i on Customers(name) where is_alive = cast(1 as bit);
【讨论】:
【参考方案11】:查看索引的类型及其含义访问: https://msdn.microsoft.com/en-us/library/ms175049.aspx
【讨论】:
以上是关于有哪些不同类型的索引,每种索引的好处是啥?的主要内容,如果未能解决你的问题,请参考以下文章
mysql有几种索引类型?使用索引时都有那些地方要注意?sql优化原则是啥?