54

自从我大约 18 个月前开始从事科技工作以来,我就听说过他们。我知道它们可能会提高性能,而且它们似乎是特定于列的——(“我们在 date_of_birth 列上索引用户表”)。

只是想快速了解它们到底是什么,它们的用途以及它们是如何工作的。

4

5 回答 5

75

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

我试图尽快回答你的问题——这并不是我擅长的。我最后一次尝试,我最终写了一本书......

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

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

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

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

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

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

于 2013-03-06T09:42:41.360 回答
11

将其视为表格的目录。如果它在那里,数据库知道在哪里看更具体。如果它不存在,则数据库必须搜索所有数据才能找到它。

可以在此 Wikipedia 文章中找到更详细的解释。

于 2013-03-05T19:29:55.753 回答
9

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

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

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

于 2013-05-20T16:24:24.800 回答
6

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

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

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

于 2013-03-05T19:28:27.813 回答
5

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

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

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

于 2013-03-05T19:35:02.570 回答