什么是数据库索引? [复制]
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_name
、first_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。检查一下,很有帮助。
我知道它们可能会提高性能
是的,这是真的。但是,请记住,有时索引也可能是性能不佳的原因。 示例:索引数据库的所有列无疑会严重影响性能。
【讨论】:
以上是关于什么是数据库索引? [复制]的主要内容,如果未能解决你的问题,请参考以下文章