【发布时间】:2018-03-11 03:54:13
【问题描述】:
我试图从 postgres EXPLAIN 输出中找出一些意义。我想了解在不同场景中将索引放在哪里。
一个例子是:
EXPLAIN for: SELECT "users".* FROM "users" INNER JOIN "user_sessions" ON "user_sessions"."user_id" = "users"."id" WHERE "user_sessions"."token" = $1 AND (user_sessions.expires_at > '2017-09-29 08:56:26.388291') [["token", "foo"]]
给我:
Nested Loop (cost=0.30..16.35 rows=1 width=192)
-> Index Scan using index_user_sessions_on_token on user_sessions (cost=0.15..8.17 rows=1 width=4)
Index Cond: ((token)::text = 'foo'::text)
Filter: (expires_at > '2017-09-29 08:56:26.388291'::timestamp without time zone)
-> Index Scan using users_pkey on users (cost=0.15..8.17 rows=1 width=192)
Index Cond: (id = user_sessions.user_id)
单个索引[user_id, token, expires_at] 是否比两个索引user_id 和[token, expires_at] 更合适?
【问题讨论】:
-
注意:如果找到多个匹配的 user_sessions 行,您的查询将产生重复。 (我建议使用 EXISTS() 构造)
标签: postgresql indexing explain