什么是数据库索引? [复制]

Posted

技术标签:

【中文标题】什么是数据库索引? [复制]【英文标题】:What is a database index? [duplicate] 【发布时间】:2013-02-20 08:41:03 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

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

【讨论】:

您完全忽略了提到有时索引不是为了提高性能,而是为了在多个列之间强制唯一性。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

非平凡的查找永远不可能是真正的 O(1)。充其量它只是隐藏了一个 O(log(N)) 进程“在”重量级 O(1) 进程下,直到某个点。 O(1) 是通过哈希索引实现的,以防相等(WHERE)查询与查询字段索引字段,这听起来正确吗? 然而:来自 postrgresql 文档:哈希索引操作目前没有 WAL 记录,因此在数据库崩溃后可能需要使用 REINDEX 重建哈希索引。它们也不会通过流式复制或基于文件的复制进行复制。由于这些原因,目前不鼓励使用哈希索引。 最终哈希是 O(​​log(N)),因为存储是 O(log(N))。只是如果你修复了它看起来像 O(1) 的存储大小。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于什么是数据库索引? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

移动/复制 SQL Server 2005 全文索引

主索引和二级索引到底有啥区别? [复制]

MySQL索引怎么工作的

mysql索引

细说mysql索引

mysql索引详解