首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确索引Rails join表迁移中的字段?

如何正确索引Rails join表迁移中的字段?
EN

Stack Overflow用户
提问于 2015-01-22 03:58:03
回答 2查看 1.2K关注 0票数 9

Rails 4引入了一个用于生成连接表迁移的特性:

代码语言:javascript
复制
bin/rails generate migration CreateTeamsUsersJoinTable team user

这将生成以下文件:

代码语言:javascript
复制
class CreateTeamsUsersJoinTable < ActiveRecord::Migration
  def change
    create_join_table :teams, :users do |t|
      # t.index [:team_id, :user_id]
      # t.index [:user_id, :team_id]
    end
  end
end

您可以看到索引被注释掉了。为什么会这样呢?我应该决定我要用哪一个吗?或者他们暗示索引是可选的?我希望确保每个字段都有某种类型的索引,以避免性能问题,但我不确定如何正确定义这些字段的索引。

EN

回答 2

Stack Overflow用户

发布于 2015-01-22 05:02:12

要完成xlembouras回答,您可以根据查询表的方式进行选择。

例如,如果您有一个显示给定团队用户的视图,则查询将如下所示:

代码语言:javascript
复制
SELECT user.name FROM team_users tu 
INNER JOIN users u 
ON tu.user_id = u.id
WHERE tu.team_id = X

这得益于t.index [:team_id, :user_id],而不是t.index [:user_id, :team_id]

数据库将仅对第一个索引使用一个索引查找来检索用户ids

如果您有一个显示给定用户的团队的视图,则查询将如下所示:

代码语言:javascript
复制
SELECT team.name FROM team_users tu 
INNER JOIN team t 
ON tu.team_id = t.id
WHERE u.user_id = X

这得益于t.index [:user_id, :team_id],而不是t.index [:team_id, :user_id]

数据库将仅对第一个索引使用一个索引查找来检索组ids

这是因为组成索引的存储方式:

票数 5
EN

Stack Overflow用户

发布于 2015-01-22 04:23:03

我不得不说,这背后的意图是让你选择更适合你的策略。这通常是一个有两个标准的决定。

  • 索引增加了多少开销
  • 如何查询db

因此,他们不能为您做出决定,并将索引开销作为约定添加。

为了做出这个决定,你需要知道你打算如何查询你的数据库。在MySQL中,复合索引可用于一组查询。multiple-column index

column_a, column_b, column_c上的索引将用于查询

和所有三个字段together

  • column_a alone
  • column_acolumn_b一起使用

所以这两者之间是有区别的

代码语言:javascript
复制
t.index [:team_id, :user_id]

代码语言:javascript
复制
t.index [:user_id, :team_id]

您实际需要的全套索引是

代码语言:javascript
复制
t.index [:team_id, :user_id]
t.index :user_id

代码语言:javascript
复制
t.index [:user_id, :team_id]
t.index :team_id

为了处理所有三种情况的索引。

示例

如果您发现您的应用程序使用更频繁的查询,如

user.teams,它转换为

select * from teams where user_id = X

user_id (或user_id, team_id)上建立索引可能很方便

所以t.index [:user_id, :team_id]应该是你的选择

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28075782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档