考虑到性能的提高,我想知道在连接表(专门用于Rails 3 has_和_belient_to_many上下文)上是否以及哪些索引是有用的.
模型和表格设置
我的型号是Foo
和Bar
,按照rails惯例,我有一个名为bars_foos
的联接表.表bar_id:integer
和foo_id:integer
中的旧字段没有主键或时间戳.我想知道以下哪项指标是最好的,并且没有重复:
- A复合指数:
add_index :bars_foos, [:bar_id, :foo_id]
- 两个索引
- A.
add_index :bars_foos, :bar_id
- B.
add_index :bars_foos, :foo_id
- 1和2-B的组合
基本上,我不确定复合指数是否足够,假设它从一开始就有帮助.我相信复合索引可以用作第一项的单一索引,这就是为什么我pretty%确信使用所有三行肯定会导致不必要的重复.
可能的用法
最常见的用法是给出Foo
型的一个实例,我将使用foo.bars
的RoR语法询问其关联的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 (?)
.
如果我不正确,请在 comments 中纠正我,但我不相信,在Rails应用程序的上下文中,它会try 在指定两个ID(如SELECT * FROM bars_foos where bar_id = ? AND foo_id = ?
)的情况下执行查询.
数据库
如果有特定于数据库的优化技术,我很可能会使用PostgreSQL.然而,其他使用这段代码的人可能希望在MySQL或SQLite中使用它,这取决于他们的Rails配置,所以所有答案都很感谢.