什么是数据库索引?

Cla*_*ell 51 database indexing

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

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

Mar*_*and 75

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

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

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

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

您可以在同一个表上但在不同的列上有许多索引.因此,索引on last_name,first_name仅与索引不同first_name(您需要通过名字优化搜索).

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

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

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

  • 您完全忽略了有时候索引不是用于性能而是用于强制跨多个列的唯一性. (5认同)

Bjo*_*ern 11

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

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


kir*_*off 10

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

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

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


Pam*_*mma 6

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

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

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


May*_*Roy 5

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

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

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