我正在阅读rails教程(http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#sidebar-database_indices),但对数据库指标的解释感到困惑,基本上作者提出的不是通过电子邮件列表(登录)搜索O(n)时间,创建索引要快得多,给出以下示例:
要理解数据库索引,考虑类比是有帮助的 一本书索引。在一本书中,找到给定的所有事件 字符串,说“foobar”,你必须扫描每页“foobar”。 另一方面,通过书籍索引,您可以查找“foobar” 索引查看包含“foobar”的所有页面。 的来源: http://ruby.railstutorial.org/chapters/modeling-users#sidebar:database_indices **
所以我从这个例子中理解的是,单词可以在文本中重复,因此“索引页面”由唯一条目组成。但是,在railstutorial网站中,登录设置为每个电子邮件地址对于一个帐户是唯一的,那么当我们每个电子邮件最多只能出现一次时,如何使索引更快?
由于
答案 0 :(得分:4)
因为DB和给定示例中的索引按字母顺序排序。原始表/书不是。然后想一想:你如何搜索已知排序的索引?我想你不会开始阅读“A”,直到你感兴趣的程度。相反,你大致跳过POI并从那里开始搜索。基本上,DB可以与索引相同。
答案 1 :(得分:4)
索引不是(很多)关于重复。这是关于订单的。
当你进行搜索时,你希望有某种顺序让你(例如)进行二进制搜索,以对数时间查找数据,而不是搜索每条记录以找到你关心的那个约(这不是唯一的索引类型,但它可能是最常见的)。
不幸的是,您只能在一个订单中自行安排记录。
索引仅包含您要用于搜索的数据(或其子集),以及包含实际数据的记录的指针(或某种类型)。这允许您(例如)根据您关心的多个不同字段进行搜索,并且仍然能够对所有字段进行二进制搜索,因为每个索引都按该字段的顺序排列。
答案 2 :(得分:1)
它更快,因为索引仅包含相关列中的值,因此它分布在比完整表少的页面上。此外,索引通常还包括其他优化,例如散列表,以限制所需的读取次数。