【问题标题】:rails - created_at when user for ordering, Should you add an Index to the table?rails - created_at 用户订购时,是否应该向表中添加索引?
【发布时间】:2011-05-25 15:14:54
【问题描述】:

您好,我有一张模特照片:

default_scope :order => 'photos.created_at DESC, photos.version DESC'

鉴于我按 CREATED_AT 和版本排序...我应该在 CREATED_AT 上有一个数据库索引吗?

谢谢

【问题讨论】:

  • 这样做似乎是一种最佳做法。但也许它不会影响速度,因为当按 id 排序时,它们(通常)已经排序,并且 Rails 会自动为 id 生成索引。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

一个可能有用的技巧:在典型的 MySql/ActiveRecord 模型中,您将拥有 id 作为数字主键(因此隐式索引),它应该与 created_at 的顺序相同 - 这意味着您可以改为按id 订购并获得快速性能,而无需额外索引的写入成本。

【讨论】:

    【解决方案2】:

    以下内容基于我的 PostgreSQL 经验,但可能也适用于 MySQL 和其他。

    如果您打算从此表中检索大量记录或使用分页,则在ORDER BY 中使用的字段上的索引会很有用。

    您应该以相同的顺序在所有订单字段上创建索引。如果您在 ORDER BY 中混合使用 ASCDESC,则需要使用这些特定顺序创建索引以充分利用索引。

    适合您的照片表的 ActiveRecord 迁移是:

    add_index :photos, [:created_at, :version]
    

    我建议在添加索引之前和之后查看EXPLAIN ANALYZE 输出和类似生产的数据,以确认它具有您想要的效果。

    【讨论】:

      【解决方案3】:

      昨晚我正在为许多表添加索引时正在阅读此内容。简短的回答是“是”。这里的案例非常雄辩:

      https://web.archive.org/web/20140426154227/https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes

      更长的答案也是“是”,但您为什么不对其进行一些测试,看看您的应用与数据交互的方式,您从中获得了什么样的里程。

      【讨论】:

      • 很棒的帖子。它不仅涉及 SQL,还涉及 ActiveRecord。但是,您不能强制在 PostgreSQL 中使用特定索引。这让我很好奇 ActiveRecord 3 中使用准备好的语句是如何工作的,因为使用 pg 获得的加速是通过避免每次进行计划分析。
      猜你喜欢
      • 1970-01-01
      • 2019-01-12
      • 2018-10-17
      • 1970-01-01
      • 2023-03-17
      • 2011-01-12
      • 1970-01-01
      • 2023-03-19
      • 2020-03-02
      相关资源
      最近更新 更多