Postgresql
如何創建索引以加快對錶達式的聚合 LIKE 查詢?
我可能在標題中問了錯誤的問題。以下是事實:
我的客戶服務人員一直抱怨在我們基於 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);
有關的: