为什么 Rails 模型关联需要索引

Why Index is Needed for Rails Model Association

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

(来自 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 列,那么为什么不将其用于 "performance boos?" 添加两个额外的索引对我来说似乎是多余的?有人可以解释一下好处吗?

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

问题:

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

解法:

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

希望对您有所帮助。