Можливо, я задаю неправильне запитання в заголовку. Ось факти:
Мої фольклорні служби скаржаться на повільний час реакції під час пошуку клієнтів на інтерфейсі адміністрування нашого сайту на базі Джанго.
Ми використовуємо 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)
Оскільки це запит, згенерований ORM Django з Django QuerySet, згенерований програмою Django Admin, я не маю ніякого контролю над самим запитом. Індекс здається логічним рішенням. Я спробував створити індекс, щоб прискорити це, але це не змінило:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
Що я роблю неправильно? Як я можу пришвидшити цей запит?