考虑到性能改进,我想知道哪些索引对连接表有帮助(特别是在 Rails 3 has_and_belongs_to_many 上下文中使用)。
模型和表格设置
我的模型是Foo
并且Bar
根据 Rails 约定,我有一个名为bars_foos
. 没有主键或时间戳使该表中的旧字段bar_id:integer
和foo_id:integer
. 我有兴趣知道以下哪些索引是最好的并且没有重复:
- 复合索引:
add_index :bars_foos, [:bar_id, :foo_id]
- 两个指标
- 一个。
add_index :bars_foos, :bar_id
- B.
add_index :bars_foos, :foo_id
- 1 和 2-B 的组合
基本上,我不确定复合索引是否足够,假设它是有帮助的开始。我相信复合索引可以用作第一项的单个索引,这就是为什么我很确定使用所有三行肯定会导致不必要的重复。
可能的用法
最常见的用法将给出模型的实例Foo
,我将bars
使用 RoR 语法询问它的关联foo.bars
,反之亦然,bar.foos
用于模型的实例Bar
。
这些将分别生成 和 类型的查询,SELECT * FROM bars_foos WHERE foo_id = ?
然后SELECT * FROM bars_foos WHERE bar_id = ?
使用这些结果 ID 到SELECT * FROM bars WHERE ID in (?)
和SELECT * FROM foos WHERE ID in (?)
。
如果我不正确,请在评论中纠正我,但我不相信,在 Rails 应用程序的上下文中,它会尝试执行一个查询,它指定两个 ID,如SELECT * FROM bars_foos where bar_id = ? AND foo_id = ?
.
数据库
如果有特定于数据库的优化技术,我很可能会使用 PostgreSQL。但是,其他使用此代码的人可能希望根据他们的 Rails 配置在 MySQL 或 SQLite 中使用它,因此感谢所有答案。