الانتقال إلى المحتوى الرئيسي
الوحدة 10 · الدرس 3 من 439/57 في الدورة~12 min
دروس الوحدة (3/4)

الفهارس المركبة والجزئية

تناولنا في الدروس السابقة استخدام الفهارس لاستعلامات نظام إدارة قواعد البيانات الخطية (WHERE country = 'Italy'). ماذا عن عندما نبحث على جبهتين مجتمعتين؟

على سبيل المثال، في التجارة الإلكترونية الحقيقية، قد نرغب في العثور على الطلبات التي تنتمي إلى معرف عميل محدد و تقع ضمن نطاق زمني محدد: محمي_INLINE_1.

إذا كان لديك فهرس أساسي فقط على customer_id، فسوف تجد Postgres طلبات العميل الخمسين في وقت قصير باستخدام الشجرة الثنائية، ولكن يتعين عليها بعد ذلك تكرار جميع الطلبات الخمسين يدويًا وبالتسلسل، وتصفية التواريخ بالعين المجردة بتكاسل.

المؤشرات المركبة

يمكننا أن نطلب من نظام إدارة قواعد البيانات أن يرتب ملفات "القاموس التحليلي" ليس على طول مفتاح واحد، بل على عدة أبعاد.

SQL
CREATE INDEX idx_orders_customer_date ON orders(customer_id, placed_at);

يتعامل الفهرس "المركب" مع ترتيب معلماته على أنه مهم جدًا: هنا يتم تجميع عقد B-Tree وتصنيفها بشكل صارم customer_id في كتلة (الأكثر تمييزًا للفصل)؛ بداخلها توجد الشجرة الفرعية المتفرعة بقيم الوقت المختلفة placed_at بترتيب مصنف بشكل مثالي.

تقوم هذه البنية بإلغاء WHERE بوحشية من الجمل ذات المسندات المتداخلة المتعددة.

الفهارس الجزئية (الفهارس المصفاة)

يكلف كل فهرس مساحة القرص ووحدة المعالجة المركزية على تدفقات إدخال المستخدم. ماذا لو كانت التجارة الإلكترونية تتطلب فرز واسترجاع عامل التصفية بشكل مستمر، ولكن فقط لعدد قليل من السجلات؟ (على سبيل المثال: إجراء استقصاء سريع للتحقق من الإشعارات غير المقروءة.) يعد إنشاء فهرس "is_read" لجميع الإشعارات البالغ عددها 10,000,000 إشعارًا أمرًا مملاً بشكل لا يصدق إذا كان "غير مقروء" يمثل 5 منها فقط.

SQL
CREATE INDEX idx_unread_notifs ON notifications(user_id)
  WHERE is_read = false; -- Questa aggiuntiva è l'"Indice Parziale"

ستقوم قاعدة البيانات بإنشاء B-Tree سريع للغاية يقوم بتخزين مفاتيح الوصول السريع إلى قاعدة البيانات فقط إذا كان السجل غير مقروء! سيقع القرص في حب فهرس مكون من 5 صفوف (3 بايت) بدلاً من واحد به 10 ملايين. تستفيد التحديدات السريعة بشكل كامل:

محمي_INLINE_6

دورك

تمرين#sql.m10.l3.e1
المحاولات: 0جارٍ التحميل…

نريد تحسين البحث عن كلمات المرور المؤقتة/رموز إعادة التعيين. نقوم في كثير من الأحيان بإجراء مكالمات SELECT للبحث عن كافة العملاء المسجلين من بلد معين بالإضافة إلى مدينة معروفة.\nقم بإنشاء فهرس مركب باسم 'idx_cust_loc' على 'العملاء'. قم بتمرير حقل "البلد" أولاً (وهو أكثر حصرية) ثم حقل "المدينة".

جارٍ تحميل المحرر…
إظهار التلميح

بناء الجملة: إنشاء اسم الفهرس على الجدول (col1, col2);

الحل متاح بعد 3 من المحاولات

استكشاف الفهارس الشرطية (الجزئية).

تمرين#sql.m10.l3.e2
المحاولات: 0جارٍ التحميل…

تحسين البحث عن مستخدم التسوق: يقوم المستخدمون بالتسجيل المسبق ولكننا نحتاج فقط إلى إدراجهم في ترتيب الاشتراك الزمني الخاص بهم (قم بإنشاء فهرس على "signed_up_on" في "العملاء") ولكن يقتصر فقط على العملاء من "المدينة" ذات السلسلة الكاملة بالضبط: "ميلانو".

جارٍ تحميل المحرر…
إظهار التلميح

يتم الإعلان عنه بشكل طبيعي على الخاصية المستهدفة؛ في النهاية تقوم بإلحاق الكلمة الأساسية السحرية WHERE city = 'Milano'.

الحل متاح بعد 3 من المحاولات