| أنواع الفهارس |
|---|
| شجرة متوازنة للمساواة والنطاقات والمسح المرتّب. الخيار الافتراضي في معظم قواعد البيانات. | استخدمها مع = و < و > و BETWEEN و ORDER BY. لا تصلح للبحث في النص الكامل. |
| فهرس مستوى أوراقه هو الجدول نفسه. تُخزَّن الصفوف بترتيب المفتاح. واحد لكل جدول. | InnoDB يعنقد على المفتاح الأساسي. جداول SQL Server بدونه تُعدّ أكوامًا (heaps). |
| بنية منفصلة تحمل المفاتيح مع مؤشر عائد إلى الجدول الأساسي. يمكن وجود عدة فهارس لكل جدول. | على الكومة يخزّن معرّف الصف، وعلى الجدول العنقودي يخزّن مفتاح العنقدة. |
| جدول تقطيع للبحث بالمساواة فقط. تطابق تام بزمن ثابت. | استخدمها لعمليات = فقط؛ النطاقات والترتيب يحتاجان B-tree. تقطيع الجداول المحسّنة للذاكرة في SQL Server يحتاج عدد دوالق قريبًا من عدد الصفوف. |
| فهرس مقلوب معمّم. يربط القيم بالصفوف. بُني للمصفوفات والنص الكامل. | استخدمه لـ jsonb والمصفوفات و tsvector والبحث بالثلاثيات. أبطأ بناءً من B-tree. |
| شجرة بحث معمّمة. قابلة للتوسعة للأنواع غير القياسية واستعلامات التداخل. | استخدمها للنطاقات الهندسية وخوارزمية kNN وقيود الاستبعاد. pg_trgm يسرّع LIKE. |
| GiST بتقسيم فضائي. يفصل البيانات إلى مناطق غير متداخلة عبر أشجار radix أو quad. | استخدمه للنقاط وبادئات IP والمطابقة بالبادئة. ليس لاستعلامات التداخل؛ استخدم GiST. |
| فهرس نطاقات الكتل. يخزّن الحد الأدنى/الأقصى لكل نطاق كتل. بصمة صغيرة جدًا. | استخدمه على الجداول الكبيرة المرتبة فيزيائيًا. رخيص البناء، ضعيف الانتقائية. |
| فهرس يُخزَّن كأجزاء أعمدة بدلًا من صفوف. ضغط عالٍ وتنفيذ دفعي. | استخدمه للمسح التحليلي عبر صفوف كثيرة وأعمدة قليلة. البحث عن صف واحد بطيء. |
| فهرس كلمات مقلوب مخصص في MySQL و SQL Server. يُبنى لكل عمود نصي. | استخدم MATCH AGAINST أو CONTAINS. البحث النصي في Postgres يستخدم بدلًا من ذلك GIN على tsvector. |
| فهرس Oracle يخزّن خريطة بتات لكل قيمة مميزة. كل بتة تشير إلى صف واحد. | استخدمه على الأعمدة منخفضة التمايز في المستودعات كثيفة القراءة. الكتابات المتزامنة تتسلسل لكل خريطة بتات. |
| عمود فهرس معرّف بـ DESC. تُخزَّن مفاتيح هذا العمود بترتيب معكوس. | لازم للترتيب المختلط مثل (a ASC, b DESC). الترتيب DESC البسيط يمكنه أيضًا قراءة فهرس عادي بالاتجاه المعاكس. |
| فهرس في MySQL 8 يتجاهله المحسِّن. يظل مُصانًا مع كل كتابة. | أخفِ الفهرس قبل حذفه لقياس الأثر. أعد إظهاره دون إعادة بناء. |
| التصميم |
|---|
| فهرس متعدد الأعمدة. يجب أن تطابق الأعمدة الأولى ترتيب مرشحات الاستعلام. | رتّب المساواة أولًا ثم النطاق. فهرسان مفردان لا يعوّضان فهرسًا مركبًا واحدًا. |
| فهرس على شرط WHERE. يسميه SQL Server فهرسًا مرشَّحًا. يغطي الصفوف المطابقة فقط. | افهرس الصفوف ذات active='t' فقط. يقلّص الحجم وكلفة الكتابة إلى النصف. |
| شجرة B-tree بأعمدة إضافية غير مفتاحية ملحقة. المسح من الفهرس وحده يجنّب الرجوع إلى الكومة. | أضف الأعمدة الجلبة كثيرًا عبر INCLUDE. يبقي الفهرس قابلًا للترتيب. |
| فهرس يمنع القيم المكررة. يرفض الإدراجات المتعارضة. | استخدمه للمفاتيح الطبيعية وقيود واحد-لواحد. UNIQUE NULL يسمح بقيم NULL كثيرة. |
| فهرس مبني على دالة للأعمدة لا على الأعمدة نفسها. | افهرس lower(email) أو date_trunc('day', created_at). يجب أن يكرر الاستعلام التعبير نفسه بدقة. |
| صنف المعاملات. يحدد كيف يقارن الفهرس نوع عمود واحد ويخزّنه. | اضبط varchar_pattern_ops لأجل LIKE 'abc%' دون طيّ حالة الأحرف. القيم الافتراضية تناسب المساواة والنطاقات. |
| خطة تجيب الاستعلام من صفحات الفهرس وحدها. لا تُقرأ الكومة أبدًا. | يحتاج كل عمود مجلوب داخل الفهرس أو قائمة INCLUDE. يحافظ Vacuum على خريطة الرؤية محدثة. |
| أعمدة المفاتيح الأجنبية لا تحصل على فهرس تلقائي في الجدول المرجِع. | افهرس كل عمود مفتاح أجنبي تربط أو تحذف عبره. الحذف المتسلسل يمسح الجدول الابن بدونه. |
| الصيانة |
|---|
| مفتش الخطط. يعرض المسح المتسلسل وخيارات الفهارس وتقديرات التكلفة. | استخدم EXPLAIN (ANALYZE, BUFFERS). ظهور Seq Scan على جدول من 10 ملايين صف يعني فهرسًا ناقصًا. |
| يأخذ عينات من أعمدة الجدول لبناء إحصاءات المخطط. المدرّجات توجّه اختيار الفهرس. | شغّله بعد التحميلات الكبيرة. الإحصاءات القديمة تسبب مسحًا متسلسلًا على أعمدة مفهرسة. |
| كل فهرس يضيف عبئًا على الكتابة. الإدراج والتحديث والحذف تدفع لكل فهرس. | احذف الفهارس غير المستخدمة. تتبّع الاستخدام في pg_stat_user_indexes. |
| عرض Postgres لاستخدام كل فهرس. يحصي عمليات المسح والصفوف المقروءة منذ تصفير الإحصاءات. | رشِّح بـ idx_scan = 0 لإيجاد الفهارس غير المستخدمة. صفّر العدادات بـ pg_stat_reset(). |
| يبني فهرسًا دون حجب القراءات أو الكتابات. يحتاج مسحًا للجدول مرتين. | لا يعمل داخل معاملة. البناء الفاشل يترك فهرسًا غير صالح (INVALID) يجب حذفه. |
| يزيل فهرسًا ويحرر تخزينه. يأخذ قفلًا حصريًا افتراضيًا. | استخدم DROP INDEX CONCURRENTLY على الجداول المزدحمة. تحقق من إحصاءات الاستخدام قبل الحذف. |
| يعيد بناء فهرس منتفخ. يسترد المساحة من الصفوف الميتة. | استخدم REINDEX CONCURRENTLY في الإنتاج. الأقفال تحجب الكتابة بدونه. |
| صفوف ميتة وفجوات صفحات تتراكم في جداول MVCC وفهارسها. | قِسها بـ pgstattuple. نفّذ Vacuum كثيرًا؛ و REINDEX حين تهيمن المساحة الميتة. |
| نسبة امتلاء الصفحة عند الكتابة. المساحة الحرة تستوعب التحديثات اللاحقة. | اخفضها إلى 70-90 في الجداول كثيفة التحديث. الصفحات الممتلئة تفرض انقسام الصفحات. |
| يعيد كتابة الجدول مرتبًا فيزيائيًا حسب فهرس. عملية لمرة واحدة. | يتكامل مع BRIN للكتل المرتبة. الترتيب لا يُحافظ عليه في الكتابات اللاحقة. |