使用日期范围为多列查询创建 rails 索引
Create rails index to multi-column query with daterange
我在处理这两个查询时遇到了一些性能问题:
any_impression = Impression.exists?(user_id: user_id, created_at: range)
any_visit = Visit.exists?(user_id: user_id, created_at: range)
他们每个用户大约有 500k 条记录,并且 运行 需要超过 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 ...
SQL:
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
手动查询以查看索引是否按您预期的那样使用。
我在处理这两个查询时遇到了一些性能问题:
any_impression = Impression.exists?(user_id: user_id, created_at: range)
any_visit = Visit.exists?(user_id: user_id, created_at: range)
他们每个用户大约有 500k 条记录,并且 运行 需要超过 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 ...
SQL:
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
手动查询以查看索引是否按您预期的那样使用。