it-swarm.asia

كيفية إنشاء فهرس لتسريع استعلام 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 من a Django QuerySet التي تم إنشاؤها بواسطة Django تطبيق المسؤول ، أنا لا ليس لديهم أي تحكم في الاستعلام نفسه. يبدو الفهرس بمثابة الحل المنطقي. حاولت إنشاء فهرس لتسريع هذا ، ولكن لم يحدث فرق:

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

ما الخطأ الذي افعله؟ كيف يمكنني تسريع هذا الاستعلام؟

22
David Eyk

لا يوجد دعم لفهرس LIKE/ILIKE في PostgreSQL 8.4 - باستثناء البحث المرتبط الأيسر) الشروط .

نظرًا لأن 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);

ذات صلة:

24
Erwin Brandstetter

لن يساعد هذا الفهرس بسبب "٪" في بداية المطابقة - يمكن أن يتطابق مؤشر BTREE فقط مع البادئات ويعني حرف البدل في بداية الاستعلام أنه لا توجد بادئة ثابتة للبحث عنها.

هذا هو السبب في أنها تقوم بمسح جدول ومطابقة كل سجل بدوره مقابل سلسلة الاستعلام.

ربما تحتاج إلى النظر في استخدام فهرس نص كامل وعوامل مطابقة النص بدلاً من البحث في السلاسل الفرعية باستخدام LIKE الذي أنت عليه حاليًا. يمكنك العثور على مزيد من البحث عن النص الكامل في الوثائق:

http://www.postgresql.org/docs/8.4/static/textearch-intro.html

في الواقع ، لاحظت من تلك الصفحة أن LIKE يبدو أنها لا تستخدم الفهارس أبدًا ، وهو أمر غريب بالنسبة لي لأنه يجب أن يكون قادرًا على حل بادئات غير أحرف البدل باستخدام فهرس BTREE. تشير بعض الاختبارات السريعة إلى أن الوثائق ربما تكون صحيحة على أي حال ، وفي هذه الحالة لن تساعد أي كمية من الفهرسة أثناء استخدامك LIKE لحل الاستعلام.

9
TomH