Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

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

  • مفهوم الفهارس و أنواعها
  • طريقة إضافة فهرس
  • طريقة إضافة فهرس يحتوي على قيم موحدة
  • طريقة حذف الفهرس

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

أي كتاب ورقي تقرؤه تجد في بدايته أو في نهايته فهرس يساعدك على البحث فيه بشكل سريع حيث تعرف من خلاله في أي صفحة يبدأ كل درس.

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

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

في قواعد البيانات يوجد نوعين أساسيين من الفهارس هما Clustered Indexes و Non Clustered Indexes و الإثنين فكرتهما تسريع عملية إيجاد المعلومات.


مفهوم الـ Clustered Indexes

الفهرس الذي نوعه Clustered يقوم بحفظ المعلومات من الأساس بشكل مرتب. فمثلاً عندما تقوم بتعيين أي عمود كمفتاح رئيسي ( Primary Key ) في الجدول، تقوم قاعدة البيانات بشكل تلقائي بإضافة فهرس له نوعه Clustered لهذا السبب كنا دائماً ما نجد قيم العمود id يتم إرجاعها بنفس الترتيب الذي تم فيه إضافتهم كما يلي.

id username first_name last_name
1 ahmad Ahmad Eid
2 ramez Ramez Morad
3 hassan Hassan Mortada
4 saad Saad Alkassem
5 zaher Zaher Fahmi

مفهوم الـ Non Clustered Indexes

الفهرس الذي نوعه Non Clustered فكرته وضع فهرس خارجي لأي عمود في الجدول يتم فيه الإشارة إلى بيانات الجدول الأساسي بشكل مرتب.

للدقة أكثر, الفهرس الخارجي يقوم بالإشارة إلى عنوان السطر في القرص الصلب ( Physical Address in Hard Drive ) الذي يحتوي على البيانات المراد فهرستها في الجدول.

كمثال بسيط، إذا أردنا وضع فهرس Non Clustered خاص للعمود username فهذا الفهرس سيحفظ قيم هذا العمود بشكل أبجدي مرتب و سيضع عنوان كل سطر في القرص الصلب تم منه إحضار القيم.
الطريقة التي يتم ترتيب القيم فيها لا يمكنك رؤيتها بعينك في قواعد البيانات و لكن يمكنك أن تتخيلها كما يلي.

username address
ahmad AB123FD123142
hassan AB87393F83AD4
ramez F83AB8D47393A
saad 80DDC62384AFB
zaher BC01234ABDFE7

الآن في حال أردت البحث عن الموظف من خلال إسم المستخدم username الخاص به فإن هذه العملية ستكون سريعة جداً حتى لو كانت قاعدة البيانات تضم مليون مستخدم، لأن قاعدة البيانات ستتمكن من إيجاد إسم المستخدم بكل سهولة في الفهرس و من بعدها ستوجهك للسطر أو الأسطر التي تملك القيمة التي بحثت عنها في الجدول الحقيقي.

متى يجب إضافة فهرس؟

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

  • إذا كنت تريد البحث عن المستخدمين من خلال إسم المستخدم يمكنك وضع فهرس على إسمه.
  • إذا كنت تريد البحث عن المستخدمين من خلال بريدهم الإلكتروني يمكنك وضع فهرس على بريده الإلكتروني.
  • إذا كنت تريد البحث عن المستخدمين نسبةً لرواتبهم يمكنك وضع فهرس على عمود الرواتب.
  • إذا كنت تريد البحث عن المستخدمين نسبةً لبلدانهم يمكنك وضع فهرس على عمود البلدان و هكذا.

فائدة الفهارس لن تظهر لك إن كنت تتعامل مع قاعدة بيانات صغيرة لأنك لن تشعر بفرق السرعة، و لكنها ستظهر لك حين تتعامل مع قاعدة بيانات فيها آلاف و ملايين الأسطر عندها ستلاحظ فرق كبير في الأداء و سرعة ممتازة في جلب البيانات.


هل إضافة فهرس لها تأثير سلبي على الأداء؟

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

هذا البطئ ليس بمهم، لأن استرجاع المعلومات بأقصى سرعة ممكنة هو الشيء المهم.

طريقة إضافة فهرس

لإضافة فهرس جديد سواء لعمود واحد أو لأكثر من عمود في ذات الوقت, نستخدم الأمر CREATE INDEX لفعل ذلك.


طريقة استخدامه

CREATE INDEX index_name
ON table_name (colums);
CREATE INDEX index_name ON table_name (colums);
  • مكان الكلمة index_name نكتب الإسم الذي نريد وضعه للفهرس.
  • مكان الكلمة table_name نكتب إسم الجدول الذي سنضع الفهرس لأعمدته.
  • مكان الكلمة columns نضع إسم العمود أو الأعمدة التي سيتم إنشاء الفهرس من أجلها مع الإشارة إلى أنه في حال أردت وضع أكثر من عمود يجب أن تضع فاصلة بين كل عمودين.

الإستعلام التالي ينشئ فهرس إسمه idx_username خاص للعمود username الموجود في الجدول users.

المثال الأول

CREATE INDEX idx_username
ON users (username);
CREATE INDEX idx_username ON users (username);

الإستعلام التالي ينشئ فهرس إسمه idx_full_name خاص للعامودين first_name و last_name الموجودين في الجدول users.

المثال الثاني

CREATE INDEX idx_full_name
ON users (first_name, last_name);
CREATE INDEX idx_full_name ON users (first_name, last_name);

طريقة إضافة فهرس يحتوي على قيم موحدة

لجعل العمود يقبل قيم موحدة يوجد ثلاث طرق يمكنك إتباع أحدها:

  • جعل نوع العمود من الأساس UNIQUE.
  • إضافة قيد ( Constraint ) للعمود نوعه UNIQUE.
  • إضافة INDEX للعمود نوعه UNIQUE و هذا ما سنتعلمه الآن.

إذاً لإضافة فهرس جديد سواء لعمود واحد أو لأكثر من عمود في ذات الوقت و جعلهم يقبلوا قيم موحدة فقط نستخدم الأمر CREATE UNIQUE INDEX


طريقة إضافة فهرس يحتوي على قيم موحدة

CREATE UNIQUE INDEX index_name
ON table_name (colums);
CREATE UNIQUE INDEX index_name ON table_name (colums);
  • مكان الكلمة index_name نكتب الإسم الذي نريد وضعه للفهرس.
  • مكان الكلمة table_name نكتب إسم الجدول الذي سنضع الفهرس لأعمدته.
  • مكان الكلمة columns نضع إسم العمود أو الأعمدة التي سيتم إنشاء الفهرس من أجلها مع الإشارة إلى أنه في حال أردت وضع أكثر من عمود يجب أن تضع فاصلة بين كل عمودين.

الإستعلام التالي ينشئ فهرس قيمه موحدة و إسمه idx_username و هو خاص للعمود username الموجود في الجدول users.

المثال الأول

CREATE UNIQUE INDEX idx_username
ON users (username);
CREATE UNIQUE INDEX idx_username ON users (username);

الإستعلام التالي ينشئ فهرس قيمه موحدة و إسمه idx_full_name و هو خاص للعمودين first_name و last_name الموجودين في الجدول users.

المثال الثاني

CREATE UNIQUE INDEX idx_full_name
ON users (first_name, last_name);
CREATE UNIQUE INDEX idx_full_name ON users (first_name, last_name);

طريقة حذف الفهرس

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


أسلوب قواعد بيانات SQL Server

DROP INDEX table_name.index_name;
DROP INDEX table_name.index_name;

أسلوب قواعد بيانات Oracle / SQLite

DROP INDEX index_name;
DROP INDEX index_name;

أسلوب قواعد بيانات Access

DROP INDEX index_name ON table_name;
DROP INDEX index_name ON table_name;

أسلوب قواعد بيانات MySQL

ALTER TABLE table_name
DROP INDEX index_name;
ALTER TABLE table_name DROP INDEX index_name;

في هذه الدورة سنعتمد أسلوب قواعد بيانات MySQL في حذف الفهارس الموضوعة لأعمدة الجداول.


الإستعلام التالي يقوم بإلغاء قيد إسمه idx_username موضوعة للجدول users.

مثال

ALTER TABLE users
DROP INDEX idx_username;
ALTER TABLE users DROP INDEX idx_username;