Postgresql

如何創建索引以加快對錶達式的聚合 LIKE 查詢?

  • July 9, 2019

我可能在標題中問了錯誤的問題。以下是事實:

我的客戶服務人員一直抱怨在我們基於 Django 的網站的管理界面上進行客戶查找時響應時間很慢。

我們正在使用 Postgres 8.4.6。我開始記錄慢查詢,並發現了這個罪魁禍首:

SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')

此查詢執行時間超過 32 秒。EXPLAIN 提供的查詢計劃如下:

QUERY PLAN
Aggregate  (cost=205171.71..205171.72 rows=1 width=0)
 ->  Seq Scan on auth_user  (cost=0.00..205166.46 rows=2096 width=0)
       Filter: (upper((email)::text) ~~ '%DEYK%'::text)

因為這是 Django ORM 從 Django Admin 應用程序生成的 Django QuerySet 生成的查詢,所以我無法控制查詢本身。索引似乎是合乎邏輯的解決方案。我嘗試創建一個索引來加快速度,但並沒有什麼不同:

CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))

我究竟做錯了什麼?我怎樣才能加快這個查詢?

PostgreSQL 8.4中沒有對LIKE/的索引支持——除了左錨搜尋詞ILIKE

PostgreSQL 9.1 開始,附加模組為支持/或正則表達式(運算符和朋友)pg_trgm的 GIN 和 GiST trigram 索引提供運算符類。每個數據庫安裝一次:LIKE``ILIKE``~

CREATE EXTENSION pg_trgm;

範例 GIN 索引:

CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);

有關的:

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