انتقل إلى محتوى الدرس
الدرس 53
دورة MySQL

إنشاء الفهارس المركبة والفريدة وفهارس النص الكامل في MySQLMySQL Creating Composite Unique and Fulltext Indexes

تعلّم إنشاء الفهارس المركبة والفريدة وفهارس النص الكامل في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

في التطبيقات الفعلية، نادراً ما يقتصر شرط البحث WHERE على عمود واحد؛ بل غالباً ما نفلتر الطلبات حسب القسم والحالة وتاريخ الإنشاء معاً. بدلاً من إنشاء ثلاثة فهارس منفصلة، يتيح لك MySQL 8.4 بناء فهرس مركب متعدد الأعمدة (Composite Index) يجمع حتى 16 عموداً داخل شجرة B+Tree واحدة.

كيف يرتب المحرك المفاتيح داخل الفهرس المركب INDEX (department_id, status, hire_date)؟

  • يرتب العقد الورقية أولاً حسب قيمة العمود الأول department_id.
  • عندما تتساوى قيمة department_id لعدة موظفين، يرتبهم داخلياً حسب العمود الثاني status.
  • وعندما تتساوى الحالة أيضاً، يرتبهم حسب العمود الثالث hire_date، تماماً كما يرتب دليل الهاتف الأسماء حسب اللقب ثم الاسم الأول ثم اسم الأب.
مخطط إنشاء الفهارس المركبة والفريدة وفهارس النص الكامل في MySQL
SQL
CREATE INDEX idx_emp_dept_status_hire ON employees (department_id, status, hire_date);

تُعدّ قاعدة البادئة اليسرى (Leftmost Prefix Rule) أهم قاعدة هندسية في فهارس B+Tree المركبة. فإذا أنشأت فهرساً مركباً بالترتيب (A, B, C)، فإن الشجرة مرتبة أولاً حسب A؛ وبالتالي لا يستطيع المحرك استخدام هذا الفهرس للبحث السريع إلا إذا بدأ شرط الاستعلام بالعمود الأيسر الأول A.

ما التوليفات التي تستفيد من الفهرس INDEX (A, B, C)؟

  • تستفيد بالكامل: الاستعلامات التي تفلتر على (A) فقط، أو (A, B) معاً، أو (A, B, C) معاً.
  • لا تستفيد من البحث الشجري: الاستعلامات التي تبحث عن (B) بمفرده، أو (C) بمفرده، أو (B, C) دون ذكر A!
  • توقف البادئة بعد شرط النطاق: إذا كان الشرط WHERE A = 5 AND B > 10 AND C = 3، فإن المحرك يستخدم الفهرس للعمودين A وB، ويتوقف عن استخدام الفهرس للعمود C لأن B > 10 شرط نطاق (Range) وليس مساواة.
SQL
SELECT emp_id, full_name FROM employees WHERE department_id = 4;

محاكي البادئة اليسرى وفهرس النص الكامل

كيف تقرر ترتيب الأعمدة عند تصميم فهرس مركب جديد؟ يعتمد المهندسون على مقياس درجة التميّز أو الانتقائية (Index Selectivity)، وتُحسب بقسمة عدد القيم الفريدة COUNT(DISTINCT col) على إجمالي صفوف الجدول COUNT(*). كلما اقتربت النسبة من 1.00 (مثل البريد الإلكتروني أو رقم العميل)، كان العمود عالي الانتقائية ويضيّق نطاق البحث فوراً إلى صفوف قليلة.

القاعدة الذهبية لترتيب الأعمدة داخل الفهرس المركب:

  • أولاً: ضع الأعمدة التي تُفلتَر بالمساواة = وتتمتع بأعلى انتقائية (High Selectivity) في بداية الفهرس يساراً.
  • ثانياً: ضع الأعمدة التي تُفلتَر بالنطاقات (>, <, BETWEEN) أو الترتيب ORDER BY على يمين أعمدة المساواة.
  • الفهارس الفريدة (CREATE UNIQUE INDEX): تضمن عدم تكرار القيم (أو توليفة الأعمدة المركبة) وتتمتع بأعلى انتقائية ممكنة 1.0000.
SQL
CREATE UNIQUE INDEX uq_customers_email ON customers (email);

في قواعد البيانات الكبيرة، قد تشك أن فهرساً قديماً لم يعد مستخدماً وتريد حذفه لتوفير الذاكرة وتسريع الكتابة؛ لكنك تخشى أن يكون هناك تقرير شهري يعتمد عليه، ولو حذفته بـ DROP INDEX فستستغرق إعادة بنائه ساعات طويلة! لحل هذه المعضلة، قدم MySQL 8 ميزة الفهارس غير المرئية (Invisible Indexes).

عندما تحوّل الفهرس إلى INVISIBLE عبر الأمر ALTER TABLE ... ALTER INDEX idx_name INVISIBLE:

  • يتجاهل محسّن الاستعلامات (Query Optimizer) هذا الفهرس تماماً وكأنه غير موجود، فتستطيع مراقبة أداء التطبيق بأمان.
  • يواصل محرك InnoDB تحديث الفهرس في الخلفية عند كل INSERT أو UPDATE.
  • إذا لاحظت بطئاً في أحد الاستعلامات، يمكنك إعادته للعمل في جزء من الألف من الثانية بالأمر ALTER INDEX idx_name VISIBLE دون إعادة بناء الشجرة!
SQL
ALTER TABLE employees ALTER INDEX idx_emp_dept_status_hire INVISIBLE;

تصلح فهارس B+Tree للبحث عن نص مطابق تماماً أو نص يبدأ ببادئة محددة، لكنها تعجز عن تسريع البحث عن كلمة في وسط مقال طويل. لهذا الغرض يوفر محرك InnoDB فهرس النص الكامل (FULLTEXT INDEX)، والذي يعتمد على الفهرس المعكوس (Inverted Index): حيث يقسم النص إلى كلمات فردية (Tokens) ويحفظ أمام كل كلمة قائمة بأرقام الصفوف التي وردت فيها.

للبحث داخل فهرس النص الكامل نستخدم الصيغة MATCH (col1, col2) AGAINST ('search terms' [MODE]) في وضعين رئيسيين:

  • IN NATURAL LANGUAGE MODE (الافتراضي): يبحث عن الكلمات المفتاحية ويحسب درجة الصلة الإحصائية (Relevance Score) لكل صف.
  • IN BOOLEAN MODE: يدعم معاملات البحث المتقدمة مثل إلزام وجود الكلمة +mysql، واستبعاد كلمة -legacy، والبحث ببادئة الكلمة optim*.
SQL
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('+innodb +index' IN BOOLEAN MODE);

يلخّص الجدول المرجعي التالي مقارنة أنواع الفهارس في MySQL 8.4، وصيغة إنشائها، وحالات الاستخدام المثلى لكل نوع:

نوع الفهرسالصيغة القياسيةالبنية الداخليةحالة الاستخدام المثلى
الفهرس المركب (Composite)CREATE INDEX idx ON tbl (c1, c2, c3)شجرة B+Tree متعددة الأعمدةالاستعلامات التي تفلتر وترتب على عدة أعمدة وفق البادئة اليسرى
الفهرس الفريد (UNIQUE)CREATE UNIQUE INDEX uq ON tbl (email)شجرة B+Tree تمنع التكرارضمان تفرد البريد الإلكتروني أو المعرّفات التجارية مع بحث سريع
الفهرس البادئ للنصوص (Prefix)CREATE INDEX idx ON tbl (url(64))أول N حرف في B+Treeفهرسة بداية الأعمدة النصية الطويلة VARCHAR/TEXT لتوفير الذاكرة
الفهرس غير المرئي (INVISIBLE)ALTER INDEX idx INVISIBLEمخفي عن المحسّن ومحدّث بالخلفيةاختبار أمان حذف الفهرس في الإنتاج دون مخاطرة إعادة البناء
فهرس النص الكامل (FULLTEXT)CREATE FULLTEXT INDEX ft ON tbl (t, b)فهرس كلمات معكوس (Inverted Index)البحث بالكلمات المفتاحية عبر MATCH() AGAINST()
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس إنشاء الفهارس المركبة متعددة الأعمدة، وتطبيق قاعدة البادئة اليسرى (Leftmost Prefix Rule)، وترتيب أعمدة الفهرس حسب درجة التميز (Selectivity)، واختبار الفهارس بأمان عبر INVISIBLE، والبحث النصي المتقدم عبر FULLTEXT وMATCH ... AGAINST.

الخطوة التالية والدرس القادم

في الدرس القادم سنتعلم كيفية قراءة وتحليل خطط تنفيذ الاستعلامات للتحقق عملياً من الفهرس الذي اختاره محرك MySQL وكشف الاختناقات الخفية.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Composite Indexes الفهارس المركبة
تعلّم إنشاء الفهارس المركبة والفريدة وفهارس النص الكامل في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Multi Column Composite Indexes إنشاء الفهارس المركبة للأعمدة
المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم إنشاء الفهارس المركبة للأعمدة في قواعد بيانات MySQL 8.4 الحديثة.
للمراجعة
03 Leftmost Prefix Rule in Action قاعدة البادئة اليسرى بالفهرس
المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم قاعدة البادئة اليسرى بالفهرس في قواعد بيانات MySQL 8.4 الحديثة.
للمراجعة
04 Column Order Strategy Selectivity ترتيب أعمدة الفهرس بالتميز
المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم ترتيب أعمدة الفهرس بالتميز في قواعد بيانات MySQL 8.4 الحديثة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 FTS FTS
Full-Text Search Inverted Index
فهرس النص الكامل المعكوس للبحث اللغوي السريع بالكلمات المفتاحية.
للمراجعة
02 LMP LMP
Leftmost Prefix Composite Rule
قاعدة البادئة اليسرى التي تحكم استفادة الاستعلامات من الفهرس المركب.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افتح عميل MySQL 8.4 المحلي ونفّذ استعلام SQL المشروح في قسم إنشاء الفهارس المركبة للأعمدة للتحقق من النتائج.

  2. بدّل بين السيناريوهات الثلاثة في المحاكي التفاعلي ضمن قسم قاعدة البادئة اليسرى بالفهرس وقارن مخرجات MySQL 8.4.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

4أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي4 أسئلة تنتظرك
01

عند وجود فهرس مركب بالترتيب (department_id, status, hire_date)، أي شرط WHERE مما يلي لا يستطيع استخدام الفهرس للبحث الشجري؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.

02

ما الهدف الهندسي من تحويل فهرس إلى غير مرئي (INVISIBLE) في MySQL 8.4؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.

03

أي صيغة SQL قياسية تُستخدم لتنفيذ بحث بالكلمات المفتاحية عبر فهرس FULLTEXT في MySQL؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.

04

كيف ترتب عمودين داخل فهرس مركب عندما يُفلتر أحدهما بالمساواة (=) والآخر بشرط نطاق (>)؟

اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.