【问题标题】:Rails DB Indexing: Is this an anti-pattern?Rails DB 索引:这是一种反模式吗?
【发布时间】:2014-07-31 19:39:39
【问题描述】:

如果我认为我的应用程序运行的查询需要它们,是否可以在 Rails 4 应用程序(使用 Postgresql)中设置这样的索引?只是检查一下,因为我不是索引专家,我不想意外导致性能问题。下面的示例应该是一个连接表。谢谢!

add_index "foo_bars", ["foo_id", "bar_id"]
add_index "foo_bars", "foo_id"
add_index "foo_bars", "bar_id"

【问题讨论】:

    标签: ruby-on-rails database postgresql indexing


    【解决方案1】:

    您可能只需要两个索引。您通常使用两列进行查询吗?如果是这样,请执行以下操作:

    add_index "foo_bars", ["foo_id", "bar_id"]
    add_index "foo_bars", ["bar_id", "foo_id"]
    

    有了这两个,无论您查询的是哪一列,您的数据库都应该找到合适的索引。它可能不会节省任何空间,但这意味着您的数据库只需在数据更改时更新两个索引(并不是说您可能会注意到速度差异)。

    但是,我敢打赌,您的查询通常只包括 foo_id 或 bar_id(不是两者),因为您可能大部分时间只是在遍历 has_many 关系。如果是这种情况,只需在各个列上定义索引。 PostgreSQL 足够聪明,可以在您查询两列时合并索引。

    add_index "foo_bars", "foo_id"
    add_index "foo_bars", "bar_id"
    

    【讨论】:

    • 实际上,在 PostgreSQL 中,您只需要在(foo, bar) 上建立一个索引,在bar 上建立一个索引即可涵盖所有可能性(假设您完全需要它)。 PostgreSQL 可以有效地将(foo, bar) 上的索引用于针对foo 的查询,但不能针对bar - 只要最左边的列匹配,它就可以使用具有部分匹配列的复合索引。但是,正如您所注意到的,它也可以回退到对两个不同索引的位图索引扫描。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多