【问题标题】:When to set Index on created_at column in Rails何时在 Rails 中的 created_at 列上设置索引
【发布时间】:2017-02-24 17:09:35
【问题描述】:

我是否需要为created_at 添加索引才能进行这样的查询?

User.posts.where('created_at > ?', 3.months.ago)

posts 表通常很大(数十万条记录),但每个用户平均有几十个帖子,最多大约 100 个。

在这些类型的情况下,您是否应用了一些通用规则来设置索引?

【问题讨论】:

    标签: ruby-on-rails postgresql indexing


    【解决方案1】:

    首先这不是正确的查询

    User.posts.where('created_at > ?', 3.months.ago)
    

    因为这一定是这样的

    current_user.posts.where('created_at > ?', 3.months.ago)
    

    此外,添加索引不是强制性的,但为了获得更好的性能,您应该将index: true 添加到带有用户参考的 Post 表迁移中。 像这样的

    t.references :user, index: true, foreign_key: true
    

    【讨论】:

    • 这不是我担心的问题的答案。
    【解决方案2】:

    不,不要使用索引。使用缓存。我不确定您在代码中的哪个位置进行此调用,因此我无法给出更具体的答案。但本指南将帮助您朝着正确的方向开始。

    http://edgeguides.rubyonrails.org/caching_with_rails.html#activesupport-cache-store

    我为此使用 Redis。这颗宝石https://github.com/redis-store/redis-rails 对我来说效果很好。

    【讨论】:

    • 问题不在于如何创建索引,而在于何时应该这样做。
    • 对不起,我没听懂你的问题。我会更新我的答案。
    • 这不是我的问题,但无论如何,您为什么主张不使用索引,这是获得更好性能的绝对基本方法?
    • 如果你缓存响应你只运行一次查询,如果使用索引你每次页面加载时运行查询。随着时间的推移,缓存总是比添加索引更快。我确实回答了您的问题,它是“我是否需要为 created_at 添加索引以进行这样的查询?...”答案是否定的,这是在浪费您的时间,并且不会像缓存一样帮助您提高网站的速度.
    • 这不是我的问题,@Randomtheories 是操作。无论如何,仅仅因为缓存很有价值并不意味着您不应该在第一次执行查询时使用索引来加快速度。在数据库中使用索引并不意味着您不能在 Rails 中使用缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2020-04-24
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多