شرح فهرسة قواعد البيانات لمطوري الويب
يبدو تطبيق الويب الخاص بك سريعًا أثناء التطوير، ولكن مع نمو البيانات، فإن الاستعلامات التي كانت تُرجع النتائج في أجزاء من الثانية تستغرق الآن ثوانٍ. يشتكي المستخدمون، ويرتفع استهلاك المعالج لقاعدة البيانات. السبب غالبًا هو فهارس مفقودة أو مُساءة الاستخدام. تُعد الفهرسة من أعلى المهارات تأثيرًا لمطوري الواجهة الخلفية، ومع ذلك غالبًا ما يُساء فهمها. يشرح هذا الدليل كيفية عمل فهارس قواعد البيانات، ومتى تستخدمها، وكيفية تجنب الأخطاء الشائعة.
ما هو فهرس قاعدة البيانات؟
فكر في الفهرس مثل الفهرس الموجود في نهاية الكتاب المدرسي. بدلاً من تصفح كل صفحة للعثور على موضوع ما، تبحث عنه في الفهرس، الذي يوجهك إلى الصفحات الصحيحة. يعمل فهرس قاعدة البيانات بالمثل: إنه بنية بيانات تسمح لمحرك قاعدة البيانات بالعثور على الصفوف بسرعة دون مسح الجدول بأكمله.
بدون فهرس، استعلام مثل SELECT * FROM users WHERE email = 'alice@example.com' يفرض مسحًا كاملاً للجدول — تقرأ قاعدة البيانات كل صف حتى تجد تطابقًا. مع فهرس على email، يمكن لقاعدة البيانات القفز مباشرة إلى الصف المطابق.
كيف تعمل الفهارس في الخلفية
تستخدم معظم قواعد البيانات العلائقية فهارس B-tree (شجرة متوازنة) افتراضيًا. تحافظ شجرة B على البيانات مرتبة وتسمح بالبحث والوصول التسلسلي والإدراج والحذف في وقت لوغاريتمي. هذا هو السبب في أن عمليات البحث المفهرسة سريعة حتى لملايين الصفوف.
تشمل أنواع الفهارس الأخرى:
- فهارس التجزئة: جيدة لعمليات البحث المطابقة التامة، وليس لاستعلامات النطاق.
- فهارس الصورة النقطية: فعالة للأعمدة منخفضة التنوع (مثل أعلام الحالة)، شائعة في مستودعات البيانات.
- فهارس النص الكامل: متخصصة في البحث في محتوى النص.
- فهارس GiST/GIN: تُستخدم في PostgreSQL للبيانات الهندسية و JSON.
بالنسبة لمعظم تطبيقات الويب، تعتبر فهارس B-tree هي العمود الفقري.
متى تنشئ فهرسًا
الفهارس ليست مجانية — فهي تستهلك مساحة تخزين وتُبطئ عمليات الكتابة. أنشئها بشكل استراتيجي:
- الأعمدة في جمل WHERE: إذا كنت تقوم بالتصفية بشكل متكرر بواسطة عمود، فقم بفهرسته.
- الأعمدة في شروط JOIN: قم بفهرسة المفاتيح الخارجية لتسريع عمليات الربط.
- الأعمدة في ORDER BY: يمكن للفهرس أن يلغي الحاجة إلى عملية فرز.
- الأعمدة في GROUP BY: يمكن أن تساعد الفهارس في استعلامات التجميع.
ومع ذلك، تجنب فهرسة الأعمدة التي نادرًا ما يتم الاستعلام عنها أو التي لها تنوع منخفض جدًا (مثل علامة منطقية) إلا إذا تم استخدامها مع أعمدة أخرى.
أنواع الفهارس وحالات استخدامها
| نوع الفهرس | الأفضل لـ | مثال |
|---|---|---|
| عمود واحد | عمليات تصفية بسيطة | CREATE INDEX idx_email ON users(email); |
| مركب | الاستعلامات التي تصفي على أعمدة متعددة | CREATE INDEX idx_name_age ON users(last_name, first_name); |
| فريد | فرض التفرد | CREATE UNIQUE INDEX idx_username ON users(username); |
| جزئي | فهرسة مجموعة فرعية من الصفوف | CREATE INDEX idx_active ON users(email) WHERE active = true; |
| مغطي | الاستعلامات التي تحتاج فقط إلى أعمدة مفهرسة | CREATE INDEX idx_covering ON users(email, name); |
كيفية إنشاء الفهارس والتحقق منها
إنشاء فهرس أمر مباشر. على سبيل المثال، في PostgreSQL:
CREATE INDEX idx_users_email ON users(email);
بعد إنشاء فهرس، تحقق من أنه قيد الاستخدام. استخدم EXPLAIN (أو EXPLAIN ANALYZE) لرؤية خطة الاستعلام:
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'alice@example.com';
ابحث عن "Index Scan" أو "Index Only Scan" بدلاً من "Seq Scan". إذا رأيت مسحًا تسلسليًا، فقد لا يتم استخدام الفهرس بسبب عدم تطابق الأنواع، أو الدوال على العمود، أو إحصائيات قديمة.
أخطاء الفهرسة الشائعة
- فهرسة كل شيء: الكثير من الفهارس يبطئ عمليات الكتابة ويهدر المساحة.
- تجاهل ترتيب الفهرس المركب: بالنسبة لفهرس مركب على
(a, b)، لا يمكن للاستعلامات التي تصفي علىbوحده استخدام الفهرس بكفاءة. - استخدام الدوال على الأعمدة المفهرسة:
WHERE YEAR(created_at) = 2025يمنع استخدام الفهرس. بدلاً من ذلك، استخدم شروط النطاق:WHERE created_at >= '2025-01-01' AND created_at < '2026-01-01'. - عدم تحديث الإحصائيات: تعتمد قواعد البيانات على الإحصائيات لاختيار الفهارس. قم بتشغيل
ANALYZEبانتظام. - التغاضي عن عبء الكتابة: يجب أن تُحدِّث كل عملية INSERT و UPDATE و DELETE الفهارس. بالنسبة للجداول كثيفة الكتابة، كن انتقائيًا.
تقنيات متقدمة
الفهارس المغطية
يتضمن الفهرس المغطي جميع الأعمدة التي يحتاجها الاستعلام، بحيث يمكن لقاعدة البيانات استرداد البيانات مباشرة من الفهرس دون لمس الجدول. هذا يمكن أن يسرع بشكل كبير الاستعلامات كثيفة القراءة.
الفهارس الجزئية
إذا كنت تستعلم بشكل متكرر عن مجموعة فرعية من الصفوف (مثل المستخدمين النشطين)، فإن الفهرس الجزئي أصغر وأسرع من الفهرس الكامل.
عمليات المسح بالفهرس فقط
تدعم بعض قواعد البيانات عمليات المسح بالفهرس فقط، حيث تكون جميع البيانات المطلوبة في الفهرس. هذا هو أسرع نوع من الوصول إلى الفهرس.
مراقبة الفهارس وصيانتها
يمكن أن تصبح الفهارس منتفخة بمرور الوقت بسبب التحديثات والحذف. في PostgreSQL، يساعد VACUUM و REINDEX في الحفاظ على الأداء. في MySQL، يمكن لـ OPTIMIZE TABLE إعادة بناء الفهارس. راجع سجلات الاستعلامات البطيئة بانتظام لتحديد الفهارس المفقودة.
الأسئلة الشائعة
كيف أعرف ما إذا كان استعلامي يستخدم فهرسًا؟
استخدم الأمر EXPLAIN (أو EXPLAIN ANALYZE) قبل الاستعلام. يُظهر الناتج ما إذا كانت قاعدة البيانات تستخدم مسحًا بالفهرس أو مسحًا تسلسليًا.
هل يمكن أن يكون لدي فهارس كثيرة جدًا؟
نعم. يضيف كل فهرس عبئًا على عمليات الكتابة ويستهلك مساحة تخزين. اهدف إلى تحقيق توازن بناءً على نسبة القراءة/الكتابة لديك.
ما الفرق بين الفهرس العنقودي وغير العنقودي؟
يحدد الفهرس العنقودي الترتيب الفعلي للصفوف في الجدول (مثل المفتاح الأساسي في InnoDB). الفهرس غير العنقودي هو بنية منفصلة تشير إلى الصفوف. يمكن أن يحتوي الجدول على فهرس عنقودي واحد فقط ولكن العديد من الفهارس غير العنقودية.
هل أنت مستعد لتحسين قاعدة البيانات الخاصة بك؟ ابدأ بتحليل استعلاماتك البطيئة وإضافة الفهارس حيثما كان ذلك ضروريًا. لتنسيق والتحقق من JSON بسرعة، جرب JSON Formatter — إنه مجاني ويعمل بالكامل في متصفحك.