Rails 4引入了一个用于生成连接表迁移的特性:
bin/rails generate migration CreateTeamsUsersJoinTable team user这将生成以下文件:
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您可以看到索引被注释掉了。为什么会这样呢?我应该决定我要用哪一个吗?或者他们暗示索引是可选的?我希望确保每个字段都有某种类型的索引,以避免性能问题,但我不确定如何正确定义这些字段的索引。
发布于 2015-01-22 05:02:12
要完成xlembouras回答,您可以根据查询表的方式进行选择。
例如,如果您有一个显示给定团队用户的视图,则查询将如下所示:
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
如果您有一个显示给定用户的团队的视图,则查询将如下所示:
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
这是因为组成索引的存储方式:

发布于 2015-01-22 04:23:03
我不得不说,这背后的意图是让你选择更适合你的策略。这通常是一个有两个标准的决定。
因此,他们不能为您做出决定,并将索引开销作为约定添加。
为了做出这个决定,你需要知道你打算如何查询你的数据库。在MySQL中,复合索引可用于一组查询。multiple-column index
column_a, column_b, column_c上的索引将用于查询
和所有三个字段together
column_a alonecolumn_a和column_b一起使用所以这两者之间是有区别的
t.index [:team_id, :user_id]和
t.index [:user_id, :team_id]您实际需要的全套索引是
t.index [:team_id, :user_id]
t.index :user_id或
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]应该是你的选择
https://stackoverflow.com/questions/28075782
复制相似问题