مقدمة إلى الفهارس Indexes في SQL


مقدمة إلى الفهارس Indexes في SQL

مقدمة إلى الفهارس Indexes في SQL

أهلاً بك! اليوم رح نتكلم عن موضوع مهم جداً في قواعد البيانات SQL: الفهارس أو الـ Indexes. لو بتشتغل على أي قاعدة بيانات، لازم تكون فاهم الفهارس كويس جداً لأنها بتفرق بشكل رهيب في أداء استعلاماتك.

إيش هي الفهارس (Indexes

ببساطة، الفهارس هي زي فهرس الكتاب بالضبط. لما تبغى تلاقي معلومة معينة في كتاب كبير، ما بتقعد تقلب صفحة صفحة صح؟ بتروح للفهرس، تشوف رقم الصفحة للموضوع اللي تبغاه، وتروح له مباشرة. الفهارس في SQL بتشتغل بنفس المبدأ.

بدون فهرس، لما تسوي استعلام (Query) على جدول كبير، قاعدة البيانات مضطرة تمر على كل صف في الجدول عشان تلاقي البيانات اللي تبغاها (هذا يسمونه Full Table Scan). تخيل لو عندك مليون صف، كم بتاخذ وقت؟ كثير جداً! الفهرس هنا بيوفر عليك الوقت والجهد.

كيف تشتغل الفهارس؟

الفهرس بيخزن نسخة مرتبة من عمود أو أكثر من الجدول، مع مؤشرات (Pointers) لموقع البيانات الأصلية في الجدول. أغلب الفهارس تستخدم بنية شجرية تسمى B-tree، اللي بتخلي البحث عن البيانات سريع جداً.

ملاحظة: الفهارس بتسرّع عمليات القراءة (SELECT) بشكل كبير، لكن ممكن تبطّئ عمليات التحديث (INSERT, UPDATE, DELETE) لأن قاعدة البيانات بتحتاج تحدث الفهرس نفسه مع كل تغيير في البيانات الأصلية.

أنواع الفهارس الشائعة

1. الفهرس التجميعي (Clustered Index)

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

مثلاً، لما تسوي PRIMARY KEY على عمود، غالباً قاعدة البيانات بتسوي له Clustered Index بشكل افتراضي.

2. الفهرس غير التجميعي (Non-Clustered Index)

هذا الفهرس ما بيغير الترتيب الفعلي للبيانات في الجدول. بدلاً من كذا، بيخزن نسخة مرتبة من العمود (أو الأعمدة) اللي عليه الفهرس، مع مؤشرات للصفوف الأصلية في الجدول. الجدول ممكن يكون له عدة فهارس غير تجميعية.

فكر فيها كفهرس الكتاب اللي تكلمنا عنه. الفهرس نفسه مرتب، لكن صفحات الكتاب ممكن ما تكون مرتبة بنفس ترتيب الفهرس.

3. الفهرس الفريد (Unique Index)

هذا الفهرس بيضمن إن كل القيم في العمود (أو الأعمدة) اللي عليه الفهرس تكون فريدة (Unique). يعني ما تقدر تدخل قيم مكررة. ممكن يكون Clustered أو Non-Clustered.

متى تستخدم الفهارس؟

  • في جمل WHERE: لو عندك عمود تستخدمه كثير في شروط البحث (مثلاً WHERE CustomerID = 123).
  • في جمل JOIN: الأعمدة اللي تستخدمها لربط الجداول (مثلاً ON Orders.CustomerID = Customers.CustomerID).
  • في جمل ORDER BY: لو بتسوي ترتيب للنتائج بشكل متكرر (مثلاً ORDER BY OrderDate).
  • في جمل GROUP BY: الأعمدة اللي تجمع عليها البيانات.
  • الأعمدة اللي فيها بيانات كثيرة ومختلفة (High Cardinality): زي أسماء العملاء، أرقام المنتجات.

متى تتجنب الفهارس؟

  • الجداول الصغيرة: لو الجدول فيه عدد قليل من الصفوف (أقل من بضعة آلاف)، الفهرس ممكن ما يكون له تأثير كبير وممكن يزيد الحمل بلا فائدة.
  • الجداول اللي تتحدث كثير (INSERT/UPDATE/DELETE): كل عملية تحديث بتحتاج تحدث الفهرس كمان، وهذا بيقلل الأداء العام.
  • الأعمدة اللي فيها بيانات قليلة ومتكررة (Low Cardinality): زي عمود Gender (ذكر/أنثى) أو Status (نشط/غير نشط). البحث في فهرس على عمود زي كذا ممكن يكون أبطأ من البحث في الجدول نفسه.

كيف تنشئ فهرس (CREATE INDEX

صيغة إنشاء الفهرس بسيطة جداً. هنا مثال:

CREATE INDEX IX_Customers_LastName
ON Customers (LastName);

هنا أنشأنا فهرس غير تجميعي اسمه IX_Customers_LastName على عمود LastName في جدول Customers.

لو تبغى فهرس فريد:

CREATE UNIQUE INDEX UQ_Products_SKU
ON Products (SKU);

وهذا بيضمن إن عمود SKU في جدول Products ما فيه أي قيم مكررة.

كيف تحذف فهرس (DROP INDEX

لو اكتشفت إن فهرس معين ما عاد له فائدة أو بيسبب مشاكل، ممكن تحذفه كذا:

DROP INDEX IX_Customers_LastName ON Customers;
-- أو في بعض قواعد البيانات زي MySQL:
-- DROP INDEX IX_Customers_LastName FROM Customers;
نصيحة ذهبية: لا تبالغ في إنشاء الفهارس! صحيح إنها تسرّع القراءة، لكن كثرتها ممكن تكون عبء على أداء الكتابة والتخزين. دائماً اختبر تأثير الفهارس على أدائك.

الخلاصة

الفهارس أداة قوية جداً لتحسين أداء استعلامات SQL، خصوصاً على الجداول الكبيرة. فهمك لأنواعها ومتى تستخدمها ومتى تتجنبها بيخليك مبرمج قواعد بيانات أفضل بكثير. دائماً حلّل استعلاماتك وشوف خطة التنفيذ (Execution Plan) عشان تعرف إذا الفهارس قاعدة تستخدم صح أو لا.

أتمنى يكون الدرس واضح ومفيد! لو عندك أي سؤال، لا تتردد.