SQL Academy · درس

الفهارس المكانية (GiST)

اجعل استعلامات المواقع سريعة

الدرس 4 من 413 خطوة

الفهارس المكانية (GiST) درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

لماذا تصبح استعلامات المواقع بطيئة

تخيلوا جدولًا يضم ملايين مواقع المطاعم. إذا طلبتم «اعثر على جميع المطاعم الواقعة ضمن مسافة 5 كم مني»، فعلى قاعدة البيانات فحص كل صف لحساب المسافة. يُسمى هذا الفحص التسلسلي، ويصبح بطيئًا جدًا مع نمو الجدول.

تحل الفهارس المكانية هذه المشكلة من خلال تنظيم بيانات الهندسة في بنية شجرية، مما يتيح لقاعدة البيانات تجاوز أجزاء كبيرة من الجدول فورًا.

ما هو فهرس GiST؟

يرمز GiST إلى شجرة البحث المعممة. وهو إطار عمل مرن للفهرسة مضمّن في PostgreSQL، ويدعم أنواعًا عديدة من البيانات، بما في ذلك الأشكال الهندسية وهندسات PostGIS.

وعلى خلاف فهرس B-tree، الذي يعمل على قيم قابلة للفرز مثل الأعداد الصحيحة أو السلاسل النصية، يستطيع GiST فهرسة البيانات متعددة الأبعاد مثل النقاط والمضلعات والخطوط. ويستخدم PostGIS داخليًا GiST لإنشاء فهارسه المكانية.

إنشاء فهرس مكاني

إن إنشاء فهرس GiST على عمود هندسة أمر مباشر. استخدموا CREATE INDEX مع عبارة USING gist. ويمكن لهذه العبارة الواحدة تحويل استعلام يستغرق دقائق إلى استعلام يستغرق أجزاء من الثانية.

CREATE INDEX idx_restaurants_geom
  ON restaurants
  USING gist (geom);

آلية عمل GiST: مربعات الإحاطة

لا يخزن فهرس GiST المكاني الهندسات الدقيقة، بل يخزن مربعات الإحاطة، وهي أصغر مستطيل يحيط بكل هندسة. وتُبنى الشجرة من خلال تجميع مربعات الإحاطة المتقاربة في كل مستوى.

عند تنفيذ استعلام، ينزل PostgreSQL عبر الشجرة ويستبعد الفروع التي لا تتداخل مربعات إحاطتها مع منطقة البحث. ثم تُفحص الصفوف المرشحة المتبقية بدقة. ويتميز هذا النهج ذي المرحلتين (فحص الفهرس + إعادة الفحص) بكفاءة عالية جدًا.

إعداد جدول نموذجي

قبل استكشاف سلوك الفهارس، لننشئ جدولًا نموذجيًا لنقاط المدن ونملأه ببضعة صفوف. يخزن العمود geom كل مدينة باعتبارها Point في WGS 84 (SRID 4326).

CREATE TABLE cities (
  id   SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  geom GEOMETRY(Point, 4326)
);

INSERT INTO cities (name, geom) VALUES
  ('Paris',    ST_SetSRID(ST_MakePoint(2.3522,  48.8566), 4326)),
  ('Berlin',   ST_SetSRID(ST_MakePoint(13.4050, 52.5200), 4326)),
  ('Madrid',   ST_SetSRID(ST_MakePoint(-3.7038, 40.4168), 4326)),
  ('Rome',     ST_SetSRID(ST_MakePoint(12.4964, 41.9028), 4326)),
  ('Warsaw',   ST_SetSRID(ST_MakePoint(21.0122, 52.2297), 4326));

إضافة فهرس GiST

بعد ملء الجدول بالبيانات، أضيفوا فهرس GiST إلى العمود geom. وبالنسبة إلى جداول الإنتاج التي تضم ملايين الصفوف، قد تستغرق هذه العبارة بضع دقائق، لكنها لا تحتاج إلى التنفيذ إلا مرة واحدة. بعد ذلك، سيستفيد كل استعلام مكاني على هذا العمود تلقائيًا.

CREATE INDEX idx_cities_geom
  ON cities
  USING gist (geom);

-- Verify the index exists
SELECT indexname, indexdef
FROM   pg_indexes
WHERE  tablename = 'cities';

عامل مربعات الإحاطة &&

يوفر PostGIS العامل && لاختبار ما إذا كان مربعا إحاطة يتداخلان. وهذا العامل مدرك للفهرس؛ إذ يستخدم المخطط فهرس GiST تلقائيًا. وهو أسرع بكثير من حساب تقاطعات الهندسات الدقيقة، وغالبًا ما يُستخدم كمرشح مسبق سريع.

-- Find cities whose bounding box overlaps a search rectangle
SELECT name
FROM   cities
WHERE  geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);

البحث عن أقرب الجيران باستخدام <->

يعيد العامل <-> المسافة بين هندستين، كما يستفيد من تسريع GiST. ويمنحكم دمجه مع ORDER BY ... LIMIT استعلامًا سريعًا جدًا عن أقرب k من الجيران (KNN)، من دون الحاجة إلى فحص الجدول بالكامل.

-- Find the 3 cities closest to a reference point (Brussels)
SELECT name,
       ST_Distance(
         geom::geography,
         ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)::geography
       ) / 1000 AS distance_km
FROM   cities
ORDER BY geom <-> ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)
LIMIT  3;

التحقق من استخدام الفهرس باستخدام EXPLAIN

استخدموا دائمًا EXPLAIN أو EXPLAIN ANALYZE للتأكد من أن المخطط يستخدم فهارسكم فعلًا. ابحثوا في المخرجات عن Bitmap Index Scan أو Index Scan using idx_cities_geom. وإذا ظهر Seq Scan بدلًا من ذلك، فقد يكون الجدول صغيرًا جدًا بحيث يفضّل المخطط عدم استخدام الفهرس.

EXPLAIN
SELECT name
FROM   cities
WHERE  geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);

إنشاء الفهرس بشكل متزامن

يؤدي إنشاء فهرس مكاني كبير باستخدام الأمر القياسي CREATE INDEX إلى قفل الجدول أمام عمليات الكتابة. وفي بيئة الإنتاج، استخدموا CREATE INDEX CONCURRENTLY لإنشاء الفهرس من دون حظر عمليات الإدراج أو التحديث. والمقابل لذلك هو أن العملية تستغرق وقتًا أطول، ولا يمكن تشغيلها داخل كتلة معاملات.

-- Safe for production tables (no write lock)
CREATE INDEX CONCURRENTLY idx_restaurants_geom
  ON restaurants
  USING gist (geom);

صيانة الفهرس المكاني

بمرور الوقت، قد تؤدي عمليات الإدراج والتحديث والحذف الكثيفة إلى تضخم الفهرس، أي نموه بشكل متشظٍ وأقل كفاءة. استخدموا REINDEX لإعادة بنائه بصورة نظيفة، أو جدولة VACUUM ANALYZE دوريًا لتحديث الإحصاءات حتى يتخذ مخطط الاستعلام قرارات أفضل.

-- Rebuild the index to remove bloat
REINDEX INDEX idx_cities_geom;

-- Update planner statistics for the table
ANALYZE cities;

اختبار سريع: فهارس GiST

اختبروا مدى فهمكم للفهرسة المكانية باستخدام GiST في PostGIS.

مراجعة: الفهارس المكانية باستخدام GiST

تعلمتم في هذا الدرس سبب أهمية الفهارس المكانية لتحقيق أداء جيد في استعلامات المواقع، وكيف يجعل GiST ذلك ممكنًا في PostgreSQL وPostGIS.

أهم النقاط:

  • GiST (شجرة البحث المعممة) هو نوع فهرس مرن يدعم بيانات الهندسة متعددة الأبعاد.
  • أنشئوا فهرسًا مكانيًا باستخدام CREATE INDEX ... USING gist (geom).
  • يخزن GiST مربعات الإحاطة ويستبعد فروع شجرة البحث، مما يتجنب فحص الجدول بالكامل.
  • يستفيد كل من العامل && (تداخل مربعات الإحاطة) والعامل <-> (المسافة/KNN) من تسريع GiST.
  • استخدموا EXPLAIN للتحقق من استخدام الفهرس، واستخدموا CREATE INDEX CONCURRENTLY في بيئة الإنتاج لتجنب أقفال الكتابة.
  • حافظوا على الفهارس باستخدام REINDEX وANALYZE لإبقاء الاستعلامات سريعة بمرور الوقت.
البدء مجانًا

تعلم SQL مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
46
الدروس
183

الأسئلة الشائعة

هل درس «الفهارس المكانية (GiST)» مجاني؟

نعم — نص درس «الفهارس المكانية (GiST)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «الفهارس المكانية (GiST)»؟

اجعل استعلامات المواقع سريعة تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الفهارس المكانية (GiST)»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أنواع البيانات المكانية
  2. المسافة وأقرب الجيران
  3. الربط المكاني والاحتواء
  4. الفهارس المكانية (GiST)
← العودة إلى SQL Academy