优化日期范围查询

时间:2016-09-26 16:33:49

标签: ruby-on-rails postgresql activerecord

日期范围查询似乎正在触及我的索引,但仍然很慢。表中约有大约30M行。我能做些什么来加快速度?

User.messages.where(message_type: 'incoming').where(created_at: start_date..end_date).explain


Message Load (8322.3ms)  SELECT "messages".* FROM "messages" WHERE "messages"."user_id" = $1 AND "messages"."message_type" = $2 AND ("messages"."created_at" BETWEEN '2016-09-23 00:00:00.000000' AND '2016-09-23 23:59:59.999999')  [["user_id", 1], ["message_type", "incoming"]]

QUERY PLAN

Index Scan using index_messages_on_created_at on messages  (cost=0.09..21223.80 rows=136690 width=527)
       Index Cond: ((created_at >= '2016-09-23 00:00:00'::timestamp without time zone) AND (created_at <= '2016-09-23 23:59:59.999999'::timestamp without time zone))
       Filter: ((user_id = 1) AND ((message_type)::text = 'incoming'::text))
       (3 rows)

1 个答案:

答案 0 :(得分:0)

理想情况下,您应该在(user_id, message_type, created_at)上拥有索引。这将允许postgres仅使用该索引来运行提供的查询。