【问题标题】:Where do indexes go when using STI?使用 STI 时索引在哪里?
【发布时间】:2012-01-28 22:55:01
【问题描述】:

我正在使用 Rails 和 postgres。

我有几个使用 STI 的模型,我想知道应该将索引放在表的什么位置,为什么?

例如,假设我有以下设置:

class Comment < AR; end
class MovieComment < Comment; end
class MagazineComment < Comment; end


# Fake Comment Table
id:integer
title:string
body:text
type:string

谢谢!

【问题讨论】:

    标签: ruby-on-rails database postgresql single-table-inheritance sti


    【解决方案1】:

    type 字段中,如果您只需要MovieCommentMagazineComment 之一。如果你不这样做,你就不需要这里的索引。我不确定 AR 是否每次都使用type,但只是为了确定。

    因为id 字段是主键,所以索引应该已经存在。

    如果您想同时通过typeid 进行查询,请确保您有一个组合索引。

    在其他字段上:取决于您查询的内容,但我想您只想检索这些。

    【讨论】:

      【解决方案2】:

      通常,您需要在执行查询时使用的列中的索引。

      如果您使用MovieComment.find(10),数据库将使用Rails 自动为您添加的id 字段中的索引。如果你这样做 Comment.find(30) 也是一样:Rails 将使用索引检索带有 id 30 的推荐,然后它将读取 type 列并返回 MovieCommentMagazineComment

      例如,如果您要添加按标题搜索的功能,您还必须在此列中创建索引。在这种情况下,可能是 :fulltext 索引。

      type 列中的索引会使MagazineComment.all 之类的查询更快,因为它等效于Comment.where(type: 'MagazineComment').all,但可能不值得。

      【讨论】:

      • 您介意详细说明为什么不值得为 type 列编制索引吗?
      • 索引有助于从数据库中选择单个记录(或非常小的记录集)。当您的选择标准包括很大比例的表时(假设 20% 的 cmets 是 MovieComment 和 80% 是 MagazineComment),数据库可能会决定每次进行全表扫描更便宜. stackoverflow.com/questions/33911589/…
      • 只想补充一点,@Daniel 并不完全正确(也不是错误的)。因为索引也用于过滤器、连接和排序。一般来说,在使用 STI 类型时,向type 添加索引是一个好主意。 “只需添加它,除非你能解释为什么不需要它”是一个更好的指导方针。
      • 您在@berkes 上基本正确,因为索引不仅用于检索行。但我的观点是,在 STI 的情况下,如果您有两种类型,那么行可能占每种类型的 50% 左右。在这种情况下,数据库不会使用索引,因为全表扫描更便宜。如果 OP 有 30 种类型(子类),情况会有所不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多