في هذا الدرس 6تصفّح المواضيع
في التطبيقات الفعلية، نادراً ما يقتصر شرط البحث WHERE على عمود واحد؛ بل غالباً ما نفلتر الطلبات حسب القسم والحالة وتاريخ الإنشاء معاً. بدلاً من إنشاء ثلاثة فهارس منفصلة، يتيح لك MySQL 8.4 بناء فهرس مركب متعدد الأعمدة (Composite Index) يجمع حتى 16 عموداً داخل شجرة B+Tree واحدة.
كيف يرتب المحرك المفاتيح داخل الفهرس المركب INDEX (department_id, status, hire_date)؟
- يرتب العقد الورقية أولاً حسب قيمة العمود الأول
department_id. - عندما تتساوى قيمة
department_idلعدة موظفين، يرتبهم داخلياً حسب العمود الثانيstatus. - وعندما تتساوى الحالة أيضاً، يرتبهم حسب العمود الثالث
hire_date، تماماً كما يرتب دليل الهاتف الأسماء حسب اللقب ثم الاسم الأول ثم اسم الأب.
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) وليس مساواة.
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.
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دون إعادة بناء الشجرة!
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*.
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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 FTS FTS
- Full-Text Search Inverted Index
- فهرس النص الكامل المعكوس للبحث اللغوي السريع بالكلمات المفتاحية.
- للمراجعة
- 02 LMP LMP
- Leftmost Prefix Composite Rule
- قاعدة البادئة اليسرى التي تحكم استفادة الاستعلامات من الفهرس المركب.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
افتح عميل MySQL 8.4 المحلي ونفّذ استعلام SQL المشروح في قسم إنشاء الفهارس المركبة للأعمدة للتحقق من النتائج.
-
بدّل بين السيناريوهات الثلاثة في المحاكي التفاعلي ضمن قسم قاعدة البادئة اليسرى بالفهرس وقارن مخرجات MySQL 8.4.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي4 أسئلة تنتظرك +
عند وجود فهرس مركب بالترتيب (department_id, status, hire_date)، أي شرط WHERE مما يلي لا يستطيع استخدام الفهرس للبحث الشجري؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
ما الهدف الهندسي من تحويل فهرس إلى غير مرئي (INVISIBLE) في MySQL 8.4؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
أي صيغة SQL قياسية تُستخدم لتنفيذ بحث بالكلمات المفتاحية عبر فهرس FULLTEXT في MySQL؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
كيف ترتب عمودين داخل فهرس مركب عندما يُفلتر أحدهما بالمساواة (=) والآخر بشرط نطاق (>)؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.