自从我大约 18 个月前开始从事科技工作以来,我就听说过他们。我知道它们可能会提高性能,而且它们似乎是特定于列的——(“我们在 date_of_birth 列上索引用户表”)。
只是想快速了解它们到底是什么,它们的用途以及它们是如何工作的。
我为此写了一本完整的书!它也可以在网上免费获得:http: //use-the-index-luke.com/
我试图尽快回答你的问题——这并不是我擅长的。我最后一次尝试,我最终写了一本书......
与表一样,索引由行和列组成,但以逻辑排序的方式存储数据以提高搜索性能。把它想象成一本电话簿(印刷版)。它们通常是排序last_name
的,first_name
可能还有其他标准(例如邮政编码)。这种排序可以快速找到特定姓氏的所有条目。如果您也知道名字,您甚至可以非常快速地找到姓/名组合的条目。
但是,如果您只知道名字,电话簿并不能真正帮助您。多列数据库索引也是如此。所以是的,索引可以潜在地提高搜索性能。如果您的问题索引错误(例如,按名字搜索时的电话簿),它们可能无用。
您可以在同一个表上但在不同的列上拥有许多索引。因此, , 上的索引与 only 上last_name
的first_name
索引不同first_name
(您需要按名字优化搜索)。
索引保存冗余数据(例如:聚集索引= 电话簿)。它们具有与表中存储的相同信息(例如:基于函数的索引),但以排序方式。对于您执行的每个写入操作(插入/更新/删除),数据库会自动维护这种冗余。因此,索引会降低写入性能。
除了快速查找数据外,索引还可用于优化排序操作(order by
)并将相关数据物理地紧密排列在一起(集群)。
为了更好地了解,请查看我的书的完整目录:http: //use-the-index-luke.com/sql/table-of-contents
将其视为表格的目录。如果它在那里,数据库知道在哪里看更具体。如果它不存在,则数据库必须搜索所有数据才能找到它。
可以在此 Wikipedia 文章中找到更详细的解释。
数据库索引是一种旨在提高查找操作时间复杂度的数据结构。
没有索引的查找是最坏情况下的O(N)
复杂性。使用索引进行高效查找可以实现对数O(log(N))
甚至某些架构O(1)
复杂性。
数据库索引还可以强制执行数据库约束。许多数据库系统在一组列上设置索引,称为PRIMARY KEY
. 一些数据库系统需要对 a 中的列FOREIGN KEY
进行索引,以加快操作(插入、更新)。
索引是一种可选结构,与表或表簇相关联,有时可以加快数据访问速度。通过在表的一个或多个列上创建索引,您可以在某些情况下从表中检索一小组随机分布的行。索引是减少磁盘 I/O 的众多方法之一。
如果堆组织表没有索引,则数据库必须执行全表扫描才能找到值。例如,在没有索引的情况下,对 hr.departments 表中位置 2700 的查询要求数据库在每个表块中的每一行中搜索该值。随着数据量的增加,这种方法不能很好地扩展。
http://docs.oracle.com/cd/E11882_01/server.112/e10713/indexiot.htm