Skip to content

فهرسة SQL مشروحة

ورقة مرجعية عن أنواع فهارس SQL وأنماط التصميم والصيانة.

تفدي الفهارس مساحة التخزين وسرعة الكتابة مقابل سرعة القراءة. اختر البنية، وحدّد نطاق الصفوف، وعالج الانتفاخ.

جدول مرجعي · 31 إدخالات
31 of 31 rows
أنواع الفهارس
شجرة متوازنة للمساواة والنطاقات والمسح المرتّب. الخيار الافتراضي في معظم قواعد البيانات.استخدمها مع = و < و > و 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 للكتل المرتبة. الترتيب لا يُحافظ عليه في الكتابات اللاحقة.