我已经四处寻找,但我似乎无法在数据库中找到唯一和非唯一索引概念背后的适当解释。
例如,在Rails中,您可以为给定字段创建唯一且非唯一的索引,如http://railsguides.net/advanced-rails-model-generators/中所述
我不明白的是:如果索引的目的是设置快捷方式"到表中的值位置以便更快地访问它,那么多个值如何共享相同的索引?
比如说我在表格中存储电子邮件,我想索引它们的值位置。 如果到目前为止,我做对了,如果我有非唯一索引,那么DB可以将foo @ bar.com索引到位置150,bar @foo.com也索引到位置150。 因此,如果我最终在位置150处说出100个不同的值,那么如果数据库仍然必须搜索150处的所有值以找到我需要的确切记录,那么这首先就会失去索引的目的。 ?
这有什么意义?
由于
答案 0 :(得分:6)
我认为你对非独特指数的含义感到有点困惑,为了澄清我会概述一些观点。
数据库索引不是与数组索引具有相同意义的索引,数据库中的索引值不一定与特定数字相关联(或者"索引")。
数据库索引实际上是一种存储(通常是已排序的)数据的数据结构,并允许快速访问特定值,这就是默认情况下不创建索引的原因,因为这些数据结构占用空间并且应该只是如果需要,创建。如果您想探索这样的数据结构,可以查看B+ trees,这是索引中最常用的数据结构之一。
现在要解决非唯一索引的概念,应该指出非唯一索引只是指非唯一表列的索引,因此索引可以包含多个具有相同索引的数据条目value,在这种情况下,索引仍然非常有用,因为它允许快速遍历条目,即使某些条目具有重复值。
我希望我至少帮助澄清了一点,如果我在任何方面弄错了,请纠正我。
答案 1 :(得分:1)
在示例电子邮件应用程序的数据模型中,为位置属性添加非唯一索引是没有意义的,因为每条消息只有一个位置,每个位置只包含一条消息;在这种情况下,索引应该是唯一的。
但请考虑一个可能的“发件人”属性。许多邮件可以来自同一个发件人。如果您的应用程序具有查找来自特定发件人的所有邮件的功能,那么在发件人列上添加非唯一索引以提高该操作的性能是有意义的。