15
أبريل

الفهارس (Indexing) في MySQL

في هذه المقالة سأتطرّق إلى موضوع مهم جدّاً في MySQL ألا وهو موضوع “الفهارس” (Indexing). تعتبر الفهارس من أهم مواضيع MySQL نظراً للفائدة العظيمة التي تتمتع بها وهي “تسريع الاستعلامات”.

ما هي الفهارس؟

من أهم المميزات في نظام إدارة قواعد البيانات (DBMS) كـ (MySQL) هي الفهارس (Indexing). لكن ما هي الفهارس؟ يمكن تشبيه فهارس نظام إدارة قواعد البيانات بفهرس الكتاب حيث يمكن الوصول إلى الصفحة المطلوبة بشكل سريع عن طريق فهرس الكتاب. كل ما عليك هو الانتقال إلى رقم الصفحة مباشرة لتقرأ الموضوع المتعلّق بها. تستخدم الفهارس في “نظام إدارة قواعد البيانات” في عمليَّة تسريع الاستعلامات والوصول إلى المعلومات المطلوبة بشكل سريع (أشبه ما تكون بفهرس الكتاب تماماً). لنا أن نتصور كم العملية ستكون مرهقة لو لم تكن الفهارس! في مثال الكتاب أعلاه يجب علينا مراجعة جميع صفحات الكتاب للوصول إلى الموضوع المطلوب! ولك أن تتصور كم العملية مرهقة (عملية مراجعة الكتاب بأكمله)! إذا لم تكن الفهارس موجودة فسيتم مراجعة الجدول بأكمله للحصول على المعلومات المطلوبة. في الجداول الصغيرة ستكون العملية سريعة نوعاً ما، لكن لن تصبح كذلك في الجداول الكبيرة. لأنه سيتم مراجعة الجدول بأكمله للحصول على البيانات المطلوبة. أما باستخدام (الفهارس) فلن يتم مراجعة الجدول بأكمله وإنما سيتم مراجعة (حقول محدّدة من الجدول فقط) وذلك باستخدام الفهرس (Index) الخاص بالحقل. للفهرسة بعض المساوئ (البسيطة) وهي:

  • سنحتاج إلى مساحة إضافية لتخزين الفهارس على القرص الصلب.
  • التاثير على سرعة إجراء الاستعلامات من نوع INSERT, UPDATE, DELETE لأنه يتوجب على نظام إدارة قواعد البيانات تحديث فهرس الحقل بعد كل عملية إضافة أو تحديث أو حذف.

لحسن الحظ ليست المساوئ أعلاه بالجدية، فالمساحة الإضافية لم تعد مشكلة اليوم، يمكنك الحصول على مساحات كبيرة وبأسعار زهيدة جداً، أما التأثير على سرعة إجراء الاستعلامات فليس بالشيء المهم لأن MySQL توفر تقنيات تساعد على تسريع عمليات تحديث الفهارس.

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

من الأفضل استخدام الفهارس على الحقول في المواضع التالية (في SELECT):

  • WHERE.
  • GROUP BY.
  • ORDER BY.

على سبيل المثال، إذا كنت تريد التحقق من اسم المستخدم يجب عليك حينها إضافة فهرس لاسم المستخدم (username):

SELECT username FROM users WHERE username = 'ahmad';

يفضّل في الاستعلام أعلاه إضافة فهرس “فريد” (Unique) إذ أن اسم المستخدم لن يتكرر في الحقل username.

أنواع الفهارس

هناك عدّة أنواع للفهارس نسردها أدناه:

الفهرسة من نوع PRIMARY (أساسي)

المفتاح الأساسي (Primary key) ببساطة يقوم بإعطاء هوية (Identity) لصف في الجدول.

بعبارة أخرى: المفتاح الأساسي هو معرف فريد (Unique) لسجل (Record) في الجدول الذي يتم استخدامه لتمثيل سجل كامل.

قد يكون حقل “معرّف المستخدم” (userID) مثلاً المفتاح الأساسي للوصول إلى الجدول.

للجدول الحق بامتلاك مفتاح أساسي واحد فقط، لكنه يستطيع إمتلاك مفاتيح أخرى كـ Unqiue و Fulltext وغيرها في نفس الوقت.

الفهرسة من نوع unique (فريد)

يدل هذا النوع من الفهرسة على أن بيانات الحقل (Field Data) ستكون (فريدة) ولن تكرر (إطلاقاً) في نفس الحقل. كمثال على الفهرسة الفريدة يمكن الإشارة إلى اسم المستخدم مثلاً، أو رقم العضوية أو رقم الهوية، أو رقم الكتاب (ISBN) فجميع هذه الحقول هي حقول فريدة لا يمكن أن تكرر إطلاقاً. ملاحظة: إنَّ أسرع فهرسة هي الفهرسة الفريدة (Unique Index) وينصح باستخدامها في الحقول التي من المفترض أن لا تتكرر (كالحقول المذكورة أعلاه). لإضافة فهرسة من نوع Unique:

1
2
3
create unique index usernameIndex
on users
(username);

فهرسة السلسة الكاملة (Fulltext)

هذا النوع من الفهرسة مناسب “للبحث النصي”. يمكن الاستعلام عن “سلاسل نصيّة معيّنة” في الحقول “المفهرسة” من نوع (fulltext). سيعيد “الاستعلام” سجّلات (Records) تحتوي على قيم مشابهة للسلسة النصية التي نبحث عنها. يمكن تطبيق هذا النوع من الفهرسة على الأنواع النصية التالية:

  • char.
  • varchar.
  • text.

لإيجاد فهرسة من نوع (fulltext) على الحقل (myinfo):

1
2
3
create fulltext index myInfo
on tableName
(name);

بعد أن قمنا بإضافة فهرسة من نوع (fulltext) إلى الحقل myInfo نأتي الآن إلى استخدام الدالة match للقيام بمطابقة النص (البحث عن نص). لاحظ أن الدالة (match) تستخدم في الفهرسة من نوع fulltext فقط ولا يمكن استخدامها في أنواع الفهرسة الأخرى. تقوم الدالة match بالبحث عن السلسة النصية المحدّدة وإعادة (درجة التطابق) كعدد في حال استخدمت match قبل WHERE مثال:

SELECT `name`, match(name) against('Ahmad') as score FROM `names`;

وفي حال استخدمت match في WHERE فيتم إعادة السلسة النصية المطابقة نفسها، مثال:

SELECT `name` FROM `names` WHERE match(name) against(BINARY 'أحمد');

هناك طريقة أخرى للبحث في فهرسة (fulltext) وهي “الطريقة المنطقية” وذلك باتباع الصيغ المنطقية التالية:

  • + :: إذا وضعت أمام كلمة ما فسيعيد السجلات التي تحتوي على هذه الكلمة.
  • :: إذا وضعت أمام كلمة ما فسيعيد السجلات التي لا تحتوي على هذه الكلمة.
  • < :: يعطي الكلمة أهمية قصوى.
  • > :: يعطي الكلمة أهمية دنيا.
  • () :: يقوم بتجميع الكلمات (يمكن أن تتداخل الكلمات).
  • ~ :: ينفي الكلمة.
  • * :: توضع في نهاية الكلمة بديلاً عن محارف أخرى.
  • :: العبارة التي توضع بين ” يتم مطابقتها مع السجلات التي تحتوي هذه العبارة.

أفضل طريقة لفهم المعاملات أعلاه هي الأمثلة، لنسرد بعض الأمثلة:

  • ‘+computer + (> Hardware < Software)’ :: يبحث عن سجلات تحتوي على الكلمات Computer Hardware أو Computer Software. ولكن Computer Hardware لها مرتبة أعلى من Computer Software.
  • comput* :: يعيد سجلات تحتوي على أي من الكلمات التي تبدأ بـ comput كـ computer, computers, compute. و…
  • computer hardware” :: يعيد السجلات التي تحتوي على computer hardware فقط.

الخاتمة

بهذا أكون قد انتهيت من أحد أهم مواضيع قواعد البيانات على أمل اللقاء في موضوع آخر.

عدد التعليقات 3

تعليقك على الموضوع

خلاصات التعليقات RSS   التعقيبات

جميع الحقوق محفوظة لـ مدونة أحمد المياحي © 2017