【发布时间】:2016-10-13 00:03:40
【问题描述】:
我有一个带有user_id 字段(字符串)的Messages 表。对于超过一百万条记录,查询唯一用户总数非常慢。
Message.where(created_at: start_date..end_date).select(:user_id).distinct(:user_id).count
=> (120145.6ms) SELECT DISTINCT COUNT(DISTINCT "messages"."user_id") FROM "messages" WHERE ("messages"."created_at" BETWEEN '2016-05-14 04:00:00.000000' AND '2016-06-13 03:59:59.999000')
我在 user_id 和 created_at 上有索引,但 postgres 似乎没有使用它们:
架构
add_index "messages", ["user_id"], name: "index_messages_on_user_id", using: :btree
add_index "messages", ["created_at"], name: "index_messages_on_created_at", using: :btree
PG 解释
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=56111.04..56291.89 rows=18085 width=29)
Group Key: user_id
-> Seq Scan on messages (cost=0.00..52215.65 rows=1558153 width=29)
Filter: ((created_at >= '2016-05-14 04:00:00'::timestamp without time zone) AND (created_at <= '2016-06-13 03:59:59.999'::timestamp without time zone))
(4 rows)
为什么不使用索引?有什么加快查询速度的技巧吗?
【问题讨论】:
标签: ruby-on-rails postgresql activerecord