1

我正在努力理解这段代码……它来自 Rails 教程书,是制作类似 twitter 的应用程序的过程的一部分。

class CreateRelationships < ActiveRecord::Migration
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps
    end

    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], unique: true
  end

end
  • 由于只有 2 列(follower_id 和 follow_id),为什么它们需要索引?
  • 索引是否以某种方式对它们进行排序?向具有 2 列的表添加索引对我来说似乎有点奇怪。
  • 索引对行有什么作用?
  • 索引是可选的吗?如果是这样,为什么/为什么不使用它?在上面的代码中使用它是个好主意吗?

如果可以,请回答所有问题。我只是想弄清楚这个概念,在阅读了它之后,我有这些问题。

4

2 回答 2

3

由于只有 2 列(follower_id 和 follow_id),为什么需要索引?

索引的需要不取决于列数。它用于加快查找速度。即使您的表只有一列,验证该列中是否存在特定值也需要您在最坏的情况下扫描整个表。使用索引可以立即回答。

索引是否以某种方式对它们进行排序?向具有 2 列的表添加索引对我来说似乎有点奇怪?

不,通常索引不会以任何方式对表中的数据进行排序。我说“一般”是因为聚集索引确实对数据进行了排序。有关更多详细信息,请参阅此问题

索引对行有什么作用?

同样,一般情况下没有什么。不同的 DBMS 使用不同的机制将表中的行与索引相关联。索引是 DBA 工作中最重要的任务之一。如果您对此有基本的想法,那就太好了。阅读维基百科文章以获取基础知识。

索引是可选的吗?如果是这样,为什么/为什么不使用它?

是的,索引是可选的。当您看到查询性能下降时,您应该使用索引。同样,不同的 DBMS 为您提供了不同的机制来监控您的查询性能,并且您应该进行监控以在性能下降超过阈值时提醒您。凭借经验,您将能够从一开始就清楚应用程序的大部分索引需求。

在上面的代码中使用它是个好主意吗?

无法对此发表评论。每个应用程序的索引需求是不同的。您还应该注意过度索引的缺点。如果你有很多索引,你的更新、插入和删除会随着时间的推移而变慢,因为它们也需要更新你的索引。

于 2013-11-12T08:14:13.063 回答
0

一列或一组列上的索引可加快对该列或一组列的查找。它的用处与表中的列数无关,因为它的目的是定位与列值关联的行。

不,索引不对表进行排序。

索引不会对行“做”任何事情,尽管如果它是“唯一”索引,它将阻止创建/更新与相关列重复的行。

索引是可选的。它加快了查找速度,但需要额外的时间进行写入操作。这是否是一个好主意完全取决于应用程序。

于 2013-11-12T08:12:27.937 回答