Postgresql
一個欄位不區分大小寫匹配並按另一欄位排序的最佳索引
我想執行這樣的查詢:
SELECT * FROM "core_user" WHERE UPPER("core_user"."email"::text) = UPPER('emailsearch@example.com') ORDER BY "core_user"."last_login" DESC LIMIT 1;
我嘗試添加兩個索引:
CREATE INDEX core_user_upper_idx ON public.core_user USING btree (upper((email)::text)); CREATE INDEX core_user_last_lo_0521b8_idx ON public.core_user USING btree (last_login);
core_user_upper_idx
如果我刪除排序子句效果很好,但在其目前狀態explain
下Limit (cost=0.29..10.33 rows=1 width=431) -> Index Scan Backward using core_user_last_lo_0521b8_idx on core_user (cost=0.29..5531.53 rows=551 width=431) Filter: (upper((email)::text) = 'EMAIL@EXAMPLE.COM'::text)
表現不佳。
有沒有更好的索引讓我在這裡添加?我有點不確定我是否應該“優先考慮”
last_login
欄位。
多列表達式索引應該為您的特定查詢提供最佳服務:
CREATE INDEX ON public.core_user (upper(email), last_login DESC);
如果
last_login
可以為 NULL,請考慮NULLS LAST
- 在索引和查詢中。經驗法則是:先相等,後範圍。看: