Postgresql

一個欄位不區分大小寫匹配並按另一欄位排序的最佳索引

  • April 29, 2021

我想執行這樣的查詢:

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)

表現不佳。

有沒有更好的索引讓我在這裡添加?我有點不確定我是否應該“優先考慮” emailorlast_login欄位。

列表達式索引應該為您的特定查詢提供最佳服務:

CREATE INDEX ON public.core_user (upper(email), last_login DESC);

如果last_login可以為 NULL,請考慮NULLS LAST- 在索引查詢中。

經驗法則是:先相等,後範圍。看:

引用自:https://dba.stackexchange.com/questions/290718