什么是数据库索引?

时间:2013-03-05 19:25:14

标签: database indexing

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

只是想快速了解它们究竟是什么,它们的用途以及它们的工作原理。

5 个答案:

答案 0 :(得分:74)

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

我很快就会回答你的问题 - 这不是我擅长的问题。我最后一次尝试,最后写了一本书......

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

但是,如果您只知道名字,那么电话簿并不能真正帮到您。多列数据库索引也是如此。所以是的,索引可以可能提高搜索性能。如果您的问题索引错误(例如,使用名字搜索电话簿),则可能无用。

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

索引包含冗余数据(例如:clustered indexes =电话簿)。它们具有与表中存储的相同的信息(例如:function based indexes),但是以排序的方式。对于您执行的每个写操作,数据库会自动维护此冗余(insert/update/delete)。因此,索引降低写入性能。

除了快速查找数据外,索引还可用于优化sort operationsorder by)并将相关数据紧密地排列在一起(clustering)。

要获得更好的主意,请查看我的图书的完整目录:http://use-the-index-luke.com/sql/table-of-contents

答案 1 :(得分:11)

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

可以找到更详细的解释here in this Wikipedia article

答案 2 :(得分:10)

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

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

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

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:5)

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

  

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

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