3

我正在阅读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 站点中,登录设置为每个电子邮件地址对一个帐户都是唯一的,那么当我们最多可以有每封电子邮件出现一次时,如何使用索引使其更快呢?

谢谢

4

3 回答 3

4

索引不是(很多)关于重复的。这是关于秩序的。

当您进行搜索时,您希望有某种顺序,让您(例如)进行二进制搜索以在对数时间内查找数据,而不是搜索每条记录以找到您关心的数据(即不是唯一的索引类型,但它可能是最常见的)。

不幸的是,您只能按单一顺序排列记录本身。

索引仅包含您将用于搜索的数据(或其子集),以及指向包含实际数据的记录的指针(或某种类型)。这允许您(例如)根据您关心的尽可能多的不同字段进行搜索,并且仍然能够对所有这些字段进行二进制搜索,因为每个索引都按该字段的顺序排列。

于 2012-05-11T06:22:53.980 回答
4

因为数据库和给定示例中的索引是字母顺序排序的。原始表/书不是。然后想一想:如果知道索引已排序,您如何搜索?我猜你没有从“A”开始阅读到你感兴趣的点。相反,您大致跳到 POI 并从那里开始搜索。基本上数据库可以与索引相同。

于 2012-05-11T06:22:25.973 回答
1

它更快,因为索引只包含来自相关列的值,因此它分布在比整个表更少的页面上。此外,索引通常包括额外的优化,例如哈希表,以限制所需的读取次数。

于 2012-05-11T06:25:11.237 回答