【发布时间】:2014-05-03 21:45:36
【问题描述】:
我正在使用 Postgresql,需要进行类似“WHERE created_at > ?”的查询。我不确定索引是否适用于此类查询。
我做了一个实验。在 created_at 列上添加索引后,我解释了以下 2 个查询。
1)
EXPLAIN SELECT * FROM categories WHERE created_at > '2014-05-03 21:34:27.427505';
结果是
QUERY PLAN
------------------------------------------------------------------------------------
Seq Scan on categories (cost=0.00..11.75 rows=47 width=528)
Filter: (created_at > '2014-05-03 21:34:27.427505'::timestamp without time zone)
2)
EXPLAIN SELECT * FROM categories WHERE created_at = '2014-05-03 21:34:27.427505';
结果是
QUERY PLAN
---------------------------------------------------------------------------------------------------
Index Scan using index_categories_on_created_at on categories (cost=0.14..8.16 rows=1 width=528)
Index Cond: (created_at = '2014-05-03 21:34:27.427505'::timestamp without time zone)
请注意,第一个使用“过滤器”,而第二个使用“索引条件”,根据 Postgresql 的文档,前者只是逐一扫描,而后者使用索引。
它是否表示像“created_at >”这样的查询?不会通过在“created_at”列上添加索引来固定?
更新
我使用的是Rails 4.0,根据控制台,索引是由
CREATE INDEX "index_categories_on_created_at" ON "categories" ("created_at")
【问题讨论】:
-
您是如何创建索引的?
-
@univerio,我更新了我的帖子
-
一切似乎都是对的,所以我唯一能想到的就是表中数据的选择性。见this question。
-
请注意,通常最好使用包含下限 (
>=),而不是独占下限。在处理所有连续范围类型时,保存上界的独占。 -
如果 Postgres 选择了错误的查询计划,this related answer might help.
标签: mysql sql ruby-on-rails postgresql ruby-on-rails-4