ATالتقنية الشاملة
software

كيف تختار Indexes صحيحة لقاعدة البيانات بدون إبطاء الكتابة

دليل عملي لفهم قرارات Database Indexing في تطبيقات الإنتاج، متى تضيف Index، متى تتجنبه، وكيف تقرأ query plan قبل التعديل.

saad-elfallahPublished May 5, 2026Updated May 25, 20266 min readEditorially reviewed
كيف تختار Indexes صحيحة لقاعدة البيانات بدون إبطاء الكتابة

كيف تختار Indexes صحيحة لقاعدة البيانات بدون إبطاء الكتابة؟

تعد Database Indexes من أهم الأدوات التي تؤثر مباشرة على أداء التطبيقات الحديثة. لكن المشكلة أن كثيراً من المطورين يتعاملون معها باعتبارها حلاً سحرياً لأي استعلام بطيء، بينما الواقع أكثر تعقيداً.

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

في هذا الدليل ستتعلم كيفية اتخاذ قرارات Indexing احترافية مبنية على البيانات الفعلية وليس التخمين.


ما هو Database Index؟

يمكن تشبيه الـ Index بفهرس كتاب ضخم.

بدلاً من البحث داخل كل صفحة للوصول إلى معلومة معينة، يسمح لك الفهرس بالانتقال مباشرة إلى القسم المطلوب.

الأمر نفسه يحدث داخل قواعد البيانات.

عندما لا يوجد Index تضطر قاعدة البيانات إلى فحص عدد كبير من الصفوف للوصول إلى البيانات المطلوبة، أما عند وجود Index مناسب فإن الوصول يصبح أسرع بكثير.

الفوائد الأساسية:

  • تسريع عمليات البحث.
  • تحسين أداء التقارير.
  • تقليل زمن الاستجابة.
  • تقليل استهلاك الموارد في الاستعلامات المتكررة.

ماذا يحدث عندما لا يوجد Index؟

لنفترض وجود جدول يحتوي ملايين المستخدمين:

SELECT *
FROM users
WHERE email = 'user@example.com';

في حال عدم وجود Index على عمود البريد الإلكتروني ستضطر قاعدة البيانات إلى فحص جميع الصفوف تقريباً.

ويظهر ذلك غالباً في خطة التنفيذ:

Seq Scan

وهو ما يسمى Sequential Scan.

كلما زاد حجم الجدول زادت المشكلة.


متى تحتاج فعلاً إلى إضافة Index؟

ليس كل استعلام بطيء يحتاج إلى Index.

ابدأ دائماً بهذه الأسئلة:

  • هل الاستعلام يتكرر كثيراً؟
  • هل الجدول كبير؟
  • هل البطء ناتج عن البحث أم عن نقل كمية ضخمة من البيانات؟
  • هل توجد Pagination؟
  • هل يوجد JOIN غير فعال؟

إذا كانت الإجابة تشير إلى مشكلة في الوصول للبيانات، فغالباً تحتاج إلى Index.


ابدأ دائماً بـ EXPLAIN ANALYZE

أكبر خطأ هو إضافة Index قبل معرفة ما يحدث فعلياً.

في PostgreSQL مثلاً:

EXPLAIN ANALYZE
SELECT *
FROM orders
WHERE tenant_id = 15;

هذه الأداة توضح:

  • نوع المسح المستخدم.
  • عدد الصفوف المقروءة.
  • الزمن الحقيقي.
  • تكلفة التنفيذ.

بدون هذه المعلومات يصبح أي قرار مجرد تخمين.


أنواع Database Indexes الأساسية

1. Single Column Index

الأكثر شيوعاً.

CREATE INDEX idx_users_email
ON users(email);

مناسب عندما يكون البحث دائماً على عمود واحد.


2. Composite Index

عندما تعتمد الاستعلامات على أكثر من عمود.

CREATE INDEX idx_orders_tenant_created
ON orders(tenant_id, created_at);

يساعد في:

SELECT *
FROM orders
WHERE tenant_id = 10
ORDER BY created_at DESC;

3. Unique Index

يجمع بين الأداء ومنع التكرار.

CREATE UNIQUE INDEX idx_username
ON users(username);

4. Partial Index

من أكثر الأدوات قوة في PostgreSQL.

CREATE INDEX idx_active_users
ON users(id)
WHERE active = true;

يفهرس فقط السجلات المطلوبة.


فهم Cardinality قبل إنشاء Index

أحد أهم المفاهيم التي يتجاهلها المطورون.

Cardinality تعني عدد القيم الفريدة داخل العمود.

مثال:

  • البريد الإلكتروني = Cardinality مرتفعة.
  • الجنس (ذكر/أنثى) = Cardinality منخفضة.

كلما ارتفعت Cardinality زادت فاعلية الـ Index.

لذلك:

email ✅
national_id ✅
phone ✅

gender ❌
status أحياناً ❌
country أحياناً ❌

ترتيب الأعمدة داخل Composite Index

الترتيب مهم جداً.

مثال:

CREATE INDEX idx_a_b
ON orders(tenant_id, created_at);

ممتاز لهذه الاستعلامات:

WHERE tenant_id = 1

وأيضاً:

WHERE tenant_id = 1
ORDER BY created_at

لكن ليس بالضرورة لهذا:

WHERE created_at > NOW() - INTERVAL '30 days'

لأن العمود الأول مختلف.


كيف تختار الأعمدة الصحيحة؟

راجع العناصر التالية:

WHERE

WHERE tenant_id = ?

ORDER BY

ORDER BY created_at DESC

JOIN

JOIN customers
ON orders.customer_id = customers.id

GROUP BY

GROUP BY tenant_id

الأعمدة المستخدمة باستمرار هنا غالباً مرشحة جيدة للفهرسة.


تأثير Index على عمليات الكتابة

كل Index إضافي له تكلفة.

عند تنفيذ:

INSERT

أو:

UPDATE

تحتاج قاعدة البيانات إلى تحديث الفهارس المرتبطة أيضاً.

لذلك:

  • كثرة الفهارس تبطئ الكتابة.
  • تزيد زمن الـ migrations.
  • تزيد استهلاك التخزين.

لهذا السبب لا ينبغي إضافة Index لكل عمود.


علامات وجود فهارس زائدة

إذا وجدت:

  • عشرات الفهارس على جدول صغير.
  • فهارس متشابهة جداً.
  • فهارس لم تُستخدم منذ أشهر.

فغالباً هناك فرصة لتحسين الأداء.

في PostgreSQL يمكن مراجعة:

pg_stat_user_indexes

لمعرفة الفهارس غير المستخدمة.


أخطاء شائعة في Database Indexing

إضافة Index لكل Slow Query

خطأ شائع جداً.

قد تكون المشكلة في:

  • تصميم الاستعلام.
  • SELECT *
  • غياب Pagination.

تجاهل حجم البيانات الحقيقي

استعلام سريع على:

10,000 rows

قد يصبح كارثياً على:

50 million rows

نسيان قياس الأداء بعد التعديل

يجب قياس:

  • Query Duration
  • CPU Usage
  • Memory Usage
  • Write Latency

قبل وبعد إنشاء الفهرس.


تجاهل تكلفة التخزين

كل Index يستهلك مساحة إضافية.

في الأنظمة الضخمة قد تصبح الفهارس وحدها عشرات الجيجابايت.


أفضل الممارسات في PostgreSQL

إذا كنت تستخدم PostgreSQL:

  • استخدم EXPLAIN ANALYZE دائماً.
  • راقب pg_stat_statements.
  • استخدم Partial Indexes عند الحاجة.
  • راجع Cache Hit Ratio.
  • احذف الفهارس غير المستخدمة بعد التحقق.

أفضل الممارسات في MySQL

في MySQL:

  • استخدم EXPLAIN باستمرار.
  • راقب Slow Query Log.
  • تجنب Duplicate Indexes.
  • راجع Cardinality.
  • اختبر الأداء قبل وبعد التغيير.

العلاقة بين Database Indexing وأداء المواقع

تحسين قاعدة البيانات ينعكس مباشرة على:

  • سرعة الصفحات.
  • Core Web Vitals.
  • تجربة المستخدم.
  • SEO التقني.

إذا كانت قاعدة البيانات بطيئة فسيظهر ذلك في زمن تحميل الصفحات حتى لو كان الكود ممتازاً.

لذلك قد يفيدك أيضاً:


Checklist قبل إنشاء أي Index

  • هل الاستعلام بطيء فعلاً؟
  • هل تم تشغيل EXPLAIN ANALYZE؟
  • هل العمود يمتلك Cardinality مناسبة؟
  • هل تمت مراجعة تأثير الكتابة؟
  • هل يوجد Index مشابه مسبقاً؟
  • هل تم اختبار الأداء بعد التعديل؟

الخلاصة

اختيار Database Indexes بشكل احترافي لا يعتمد على التخمين أو نسخ الحلول من الإنترنت. ابدأ دائماً بتحليل الاستعلامات الحقيقية، استخدم EXPLAIN ANALYZE، افهم نمط القراءة والكتابة، ثم أضف أقل عدد ممكن من الفهارس التي تحقق أكبر تأثير.

الفهرس الصحيح يمكن أن يحول استعلاماً يستغرق ثوانٍ إلى أجزاء من الثانية، بينما الفهرس الخاطئ قد يزيد التعقيد والتكلفة دون أي فائدة حقيقية.

Frequently Asked Questions

هل كل slow query تحتاج Index؟

لا. أحيانًا المشكلة في شكل query أو حجم البيانات المرجعة أو غياب pagination.

ما أهم أداة قبل إضافة Index؟

استخدم EXPLAIN أو EXPLAIN ANALYZE لفهم الخطة بدل التخمين.

Saad Elfallah

الكاتب

Saad Elfallah

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

Related articles

دليل تطبيق ChatGPT لسطح المكتب: الإصدارات والتحميل والاستخدام 2026
البرمجيات

دليل تطبيق ChatGPT لسطح المكتب: الإصدارات والتحميل والاستخدام 2026

الدليل الشامل لتطبيق ChatGPT لسطح المكتب في 2026. تعرف على كيفية تحميل وتثبيت تطبيق ChatGPT لنظامي Windows و macOS، الميزات الحصرية، اختصارات لوحة المفاتيح، المقارنة مع الإصدارات الأخرى، ونصائح للاستخدام الفعال.

9 min readJuly 6, 2026saad-elfallah