关于索引:什么是数据库索引?

What is a database index?

本问题已经有最佳答案,请猛点这里访问。

自从我18个月前开始在科技公司工作以来,我就听到他们谈论过。我知道它们可能会提高性能,而且它们似乎是特定于列的——(我们在"出生"列的日期为用户表编制索引)。

只需快速浏览一下它们到底是什么,它们被用来做什么,以及它们是如何工作的。


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

我试着很快回答你的问题,这不是我擅长的。上次我试过的时候,我写了一本书…

与表一样,索引由行和列组成,但以逻辑排序的方式存储数据,以提高搜索性能。把它想象成一本电话簿(印刷本)。它们通常被分类为last_namefirst_name和可能的其他标准(例如邮政编码)。这种排序可以快速查找特定姓氏的所有条目。如果你也知道名字,你甚至可以很快找到姓氏/名字组合的条目。

但是,如果你只知道名字,电话簿并不能真正帮助你。对于多列数据库索引也是如此。因此,索引可以潜在地提高搜索性能。如果你的问题索引错误(比如按名字搜索时的电话簿),它们可能是无用的。

在同一个表上可以有多个索引,但在不同的列上可以有多个索引。因此,last_namefirst_name上的索引不同于first_name上的索引(只需要按名字优化搜索)。

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

除了快速查找数据外,索引还可以用于优化排序操作(order by)和将相关数据紧密地安排在一起(集群)。

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


把它想象成一张桌子的目录。如果它在那里,数据库知道在哪里查找更具体的内容。如果没有,数据库必须搜索所有数据才能找到它。

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


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

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

数据库索引还可以强制执行DB约束。许多数据库系统在一组称为PRIMARY KEY的列上设置索引。有些数据库系统需要对FOREIGN KEY中的列进行索引,以便加快操作(插入、更新)。


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

如果堆组织的表没有索引,那么数据库必须执行完整的表扫描以查找值。例如,在没有索引的情况下,在hr.departments表中对位置2700的查询要求数据库在每个表块的每一行中搜索该值。这种方法不能很好地扩展数据量。

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


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

I know that they potentially improve performance

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