【发布时间】:2012-06-03 04:00:50
【问题描述】:
考虑到性能改进,我想知道哪些索引对连接表有帮助(特别是在 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] - 两个索引
- A.
add_index :bars_foos, :bar_id - 乙。
add_index :bars_foos, :foo_id
- 1 和 2-B 的组合
基本上,我不确定复合索引是否足够,假设它有助于开始。我相信复合索引可以用作第一项的单个索引,这就是为什么我漂亮确信使用所有三行肯定会导致不必要的重复。
可能的用途
最常见的用法是模型Foo的实例,我将使用foo.bars的RoR语法询问其关联的bars,反之亦然,bar.foos是模型@的实例987654333@.
这些将分别生成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 (?)。
如果我不正确,请在 cmets 中纠正我,但我不相信,在 Rails 应用程序的上下文中,它会尝试执行一个查询,其中指定两个 ID,如 SELECT * FROM bars_foos where bar_id = ? AND foo_id = ?。
数据库
如果有特定于数据库的优化技术,我很可能会使用 PostgreSQL。但是,其他使用此代码的人可能希望根据他们的 Rails 配置在 MySQL 或 SQLite 中使用它,因此所有答案都值得赞赏。
【问题讨论】:
标签: ruby-on-rails database-design indexing rails-migrations