ruby-on-rails - 使用 daterange 创建多列查询的 Rails 索引

标签 ruby-on-rails postgresql activerecord rails-activerecord postgresql-9.3

我在处理这两个查询时遇到了一些性能问题:

any_impression = Impression.exists?(user_id: user_id, created_at: range)
any_visit      = Visit.exists?(user_id: user_id, created_at: range)

他们为每个用户准备了大约 50 万条记录,并且运行时间超过 15 秒。

基于此,我想创建两个索引,每个索引一个。

我的问题是,我应该创建的索引是:

add_index :visits, [:user_id, :created_at]
add_index :impressions, [:user_id, :created_at]

或者需要更多特定信息来查询上面使用创建的索引?

非常感谢。

最佳答案

那些索引应该没问题。在 Postgres 中,索引并不总是知道如何使用给定的运算符——它取决于索引类型。 This page from the manual解释细节。

您建议的索引将是 btree 索引。在我的实验中,告诉 ActiveRecord 根据范围查询时间戳列会生成 BETWEEN ... AND ...数据库:

User.where(created_at: (Date.parse('2015-01-01') ..
                        Date.parse('2016-01-01'))).to_sql

给出:

SELECT "users".*
FROM   "users"
WHERE  ("users"."created_at" BETWEEN '2015-01-01' AND '2016-01-01')

这也是您所看到的吗?那么 Postgres 应该使用你的索引,因为 BETWEEN只是<=>= .

您也可以使用 EXPLAIN 手动运行查询或 EXPLAIN ANALYZE查看索引是否按预期使用。

关于ruby-on-rails - 使用 daterange 创建多列查询的 Rails 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37839905/

相关文章:

ruby-on-rails - 如何将 ruby​​ on Rails 项目部署到仅包含 ruby​​ 的服务器?

ruby-on-rails - 使用 Kernel#fork 进行后台进程,专业人士?缺点?

ruby-on-rails - Mechanize 设置具有重复名称的字段

ruby-on-rails - 使用 Rails 复制到冗余服务器?

ruby-on-rails - rails : how to make class method scope to handle nil arguments

javascript - Shopify ScriptTag 无法正常工作

python - 不使用 pg_dump 从 PostgreSQL 数据库中提取数据

python - 如何使用 GROUP BY 和 HAVING 与 SQLAlchemy 和 Postgresql 获取具有最大更新日期时间的行

ruby-on-rails - 在 Active Record 中返回 sibling (child.parent.children)

mysql - Codeigniter Active Record/MySQL 查询 - group_by 导致仅返回一行