Ich stelle möglicherweise die falsche Frage im Titel. Hier sind die Fakten:
Mein Kundenservice hat sich über langsame Antwortzeiten beschwert, als er auf der Administrationsoberfläche unserer Django-basierten Site nach Kunden gesucht hat.
Wir verwenden Postgres 8.4.6. Ich begann langsame Abfragen zu protokollieren und entdeckte diesen Täter:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
Die Ausführung dieser Abfrage dauert mindestens 32 Sekunden. Hier ist der von EXPLAIN bereitgestellte Abfrageplan:
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)
Da dies eine Abfrage ist, die vom Django ORM aus einem Django QuerySet generiert wurde, das von der Django Admin-Anwendung generiert wurde, kann ich die Abfrage selbst nicht steuern. Ein Index scheint die logische Lösung zu sein. Ich habe versucht, einen Index zu erstellen, um dies zu beschleunigen, aber es hat keinen Unterschied gemacht:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
Was mache ich falsch? Wie kann ich diese Abfrage beschleunigen?