什么是数据库索引?

自从18个月前我开始在科技领域工作以来,我听说过他们谈过这个话题。 我知道他们可能会提高性能,而且他们似乎是专栏专用的 – (“我们在date_of_birth列索引用户表”)。

只要简单地看一下它们究竟是什么,它们用于什么以及它们是如何工作的。

我写了一本完整的书! 它也可以免费在网上: http : //use-the-index-luke.com/

我尽量回答你的问题 – 这不正是我擅长的。 我最后一次尝试,最后写了一本书。

像表一样,索引由行和列组成,但是以逻辑方式存储数据以提高search性能。 把它想象成一个电话簿(一个印刷的)。 他们通常sortinglast_namefirst_name和其他标准(如邮政编码)。 通过此sorting,可以快速查找特定姓氏的所有条目。 如果您也知道名字,甚至可以很快find组合姓氏/名字的条目。

但是,如果你只知道名字,那么电话本并不能真正帮助你。 多列数据库索引也是如此。 所以是的,索引可以提高search性能。 如果你的问题有错误的索引(例如按名字search电话簿),那么它们可能是没用的。

您可以在同一张表上有许多索引,但在不同的列上。 因此, last_namefirst_name上的索引仅与first_name上的索引不同(您需要根据名字优化search)。

索引保存冗余数据(例如: 聚簇索引 =电话簿)。 它们具有与存储在表中相同的信息(例如: 基于函数的索引 ),但是以一种sorting的方式。 数据库为您执行的每个写入操作( 插入/更新/删除 )自动维护此冗余。 因此,索引降低了写入性能。

除了快速查找数据之外,还可以使用索引来优化sorting操作 ( order by ),并将相关数据紧密排列在一起( 集群 )。

为了获得更好的想法,请查看本书的完整目录: http : //use-the-index-luke.com/sql/table-of-contents

把它看作表格的目录。 如果在那里,数据库知道哪里看起来更具体。 如果不存在,数据库必须search所有数据才能find它。

在这篇维基百科文章中可以find更详细的解释。

数据库索引是旨在提高查找操作时间复杂度的数据结构。

没有索引的查找在最坏的情况下是O(N)复杂度。 使用索引进行高效查找可实现对数O(log(N)) ,甚至具有某种架构O(1)复杂性。

数据库索引也可以强制DB约束。 许多DB系统在称为PRIMARY KEY一组列上设置索引。 某些数据库系统需要索引FOREIGN KEY列,以加快操作(插入,更新)。

索引是一个可选结构,与表或表集群相关联,有时可以加速数据访问。 通过在表的一列或多列上创build索引,在某些情况下,您可以从表中检索一小组随机分布的行。 索引是减less磁盘I / O的很多方法之一。

如果堆组织的表没有索引,则数据库必须执行全表扫描以查找值。 例如,如果没有索引,则hr.departments表中的位置2700的查询要求数据库search每个表块中的每一行以获取该值。 随着数据量的增加,这种方法不能很好地扩展。

http://docs.oracle.com/cd/E11882_01/server.112/e10713/indexiot.htm

它有一个非常类似的线程在这里运行。 检查,这是有帮助的。

我知道他们可能会提高性能

对,是真的。 但是,请记住,有时索引也可能是造成性能不佳的原因。 例如:索引数据库的所有列无疑会严重影响性能。