【问题标题】:Why Index is Needed for Rails Model Association为什么 Rails 模型关联需要索引
【发布时间】:2015-10-03 20:40:22
【问题描述】:

我对模型关联中的索引列的话题有点困惑。

(来自 The Rails 4 Way)我们有 UserTimesheetExpense Report 模型。

User 模型:

has_many: timesheets
has_many: expense_reports

(连同其他型号中对应的belongs_to

Rails 4 Way 书中将add_index 说成是timesheetsexpense_reports 模型:

add_index :timesheets, :user_id
add_index :expense_reports, :user_id

我不明白在每个外键列之后添加索引的原因。 timesheetexpense_report 表已经有一个 primary_key 列,那么为什么不将其用于“性能提升”?添加两个额外的索引对我来说似乎是多余的?有人能解释一下好处吗?

【问题讨论】:

    标签: ruby-on-rails ruby database model associations


    【解决方案1】:

    我知道你的挫败感来自哪里,跟着我走,我相信你会很快得到它......

    问题:

    在数据库中创建列时,考虑是否需要从该列中查找和检索记录至关重要。因此,假设我们有一个 User 表,每个用户都有一个 email,在许多应用程序中用于用户的身份验证和授权。当我们允许用户登录我们的应用程序时,我们需要找到与提交的电子邮件地址对应的用户记录。 不幸的是,通过电子邮件地址查找用户的唯一方法是扫描数据库中的每个用户行并将其电子邮件属性与给定电子邮件进行比较 - 因此,这意味着我们可能必须检查每个行(因为用户可以是数据库中的最后一个人)。如您所想,这将花费大量时间。简而言之,这不好。

    解决方案:

    在电子邮件列上放置一个索引可以解决问题。将其视为本书末尾的附录。在书中,要查找给定字符串的所有出现,比如“foobar”,您必须扫描每一页以查找“foobar”——全表扫描的纸质版本。另一方面,使用图书索引,您只需在索引中查找“foobar”即可查看包含“foobar”的所有页面。数据库索引的工作方式基本相同。

    希望对你有所帮助。

    【讨论】:

    • 首先非常感谢您的回答,我已经完成了 90% 的工作。我现在的问题是:假设客户提交 me@myself.com。我看到的问题是它仍然需要至少扫描整个 email 列才能找到正确的列。那么您是说索引可以仅扫描一列而不是整行的整个数据库吗?抱歉,如果我仍然不理解,但最初我看不到索引有什么帮助,因为输入的 email 显然不会伴随正确的索引...
    • 通过在表的一个或多个列上创建索引,您可以在某些情况下从表中检索一小组随机分布的行。索引是减少磁盘 I/O 的众多方法之一。如果仍有疑问,我强烈建议您查看此Wikipedia link
    • 非常感谢您的帮助,就像我说的差不多了,但我会继续阅读。
    • 要补习的东西很多,不要让它吓到你,你最终会得到它。一切顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多