私はpostgres EXPLAIN
の出力からいくつかの意味を作ろうとしています。さまざまなシナリオでインデックスをどこに配置するかを知りたい。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]
を持つ2つのインデックスよりも "より" が適切であろうか?
注:複数の一致するuser_sessions行が見つかると、クエリの結果は重複します。 (私はEXISTS()構文を使用することをお勧めします) – joop