MySQL دليل إنشاء وإضافة وحذف الملفات
⚡ ملخص ذكي
MySQL يشرح هذا الدليل كيفية قيام الفهارس بفرز البيانات وتحديد مواقعها بسرعة. الفهرس عبارة عن بنية بحث مُرتبة تُنشأ على عمود واحد أو أكثر؛ يُضيف الأمر CREATE INDEX الفهرس، ويفحصه الأمر SHOW INDEXES، ويحذفه الأمر DROP INDEX عندما تتجاوز فوائد الكتابة في الجداول فوائد القراءة.

ما هو MySQL فِهرِس؟
An مؤشر in MySQL الفهرس هو بنية بيانات تخزن قيم الأعمدة بطريقة مُرتبة، مما يُمكّن المُحرك من البحث عن الصفوف بسرعة. تُنشأ الفهارس على العمود أو الأعمدة الأكثر استخدامًا لتصفية البيانات. تخيّل الفهرس كقائمة مُرتبة أبجديًا: فالعثور على اسم في قائمة مُرتبة أسرع بكثير من العثور عليه في قائمة غير مُرتبة.
تُعدّ الفهارس عنصرًا ذا أهمية، إذ يتطلب كل إدخال أو تحديث الحفاظ على الفهرس، لذا فإن إضافة عدد كبير جدًا من الفهارس إلى جدول ذي عمليات كتابة مكثفة قد يؤثر سلبًا على الأداء العام. وكقاعدة عامة، يُنصح بفهرسة الأعمدة التي تظهر في عبارات WHERE وJOIN وORDER BY في الجداول التي تُقرأ أكثر من تلك التي تُكتب إليها.
لماذا نستخدم الفهرس؟
لا أحد يُحب الأنظمة البطيئة. يُعدّ الأداء العالي أولوية قصوى لجميع التطبيقات التي تعتمد على قواعد البيانات تقريبًا. تُنفق الشركات مبالغ طائلة على الأجهزة لضمان سرعة الاستعلامات، ولكن هناك حدٌّ أقصى لما يُمكن أن تُحقّقه الأجهزة وحدها. يُعدّ تحسين الفهارس وسيلةً أقل تكلفةً وأكثر فعالية.
عادةً ما ينتج بطء الاستجابة عن تخزين الصفوف بالترتيب الفعلي على القرص. بدون فهرس، MySQL يجب فحص كل صف للعثور على الصفوف التي تطابق شرطًا معينًا - وهو ما يُعرف بـ "الفحص الكامل للجدول". تسمح الفهارس MySQL الانتقال مباشرة إلى الصفوف المطابقة، مما يحول خطة الاستعلام من O(n) إلى O(log n) تقريبًا لعمليات البحث في شجرة B.
بناء الجملة: إنشاء فهرس
يمكن تعريف الفهرس في مكانين:
- عند إنشاء الجدول.
- بعد أن يكون الجدول موجودًا بالفعل.
مثال: إنشاء فهرس مضمن في أمر إنشاء جدول
بالنسبة myflixdb في قاعدة البيانات، نتوقع إجراء العديد من عمليات البحث على عمود الاسم الكامل. يقوم البرنامج النصي أدناه بإنشاء جديد members_indexed جدول يحتوي على فهرس full_names العمود.
CREATE TABLE `members_indexed` (
`membership_number` INT(11) NOT NULL AUTO_INCREMENT,
`full_names` VARCHAR(150) DEFAULT NULL,
`gender` VARCHAR(6) DEFAULT NULL,
`date_of_birth` DATE DEFAULT NULL,
`physical_address` VARCHAR(255) DEFAULT NULL,
`postal_address` VARCHAR(255) DEFAULT NULL,
`contact_number` VARCHAR(75) DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`membership_number`),
INDEX (`full_names`)
) ENGINE = InnoDB;
قم بتنفيذ البرنامج النصي في MySQL ورشة العمل ضد myflixdb قاعدة البيانات.
تحديث myflixdb لمشاهدة الجديد members_indexed الطاولة. ال full_names يظهر العمود الآن أسفل الفهارس العقدة.
مع ازدياد عدد الأعضاء، تزداد استفسارات البحث على members_indexed التي تستخدم WHERE و ORDER BY ضد full_names أسرع بكثير من نفس الاستعلامات على الأصل members جدول بدون فهرس.
أضف فهرسًا بعد أن يكون الجدول موجودًا بالفعل
ستكتشف غالبًا أن الجدول الموجود يحتاج إلى فهرس - استعلامات البحث بطيئة، وخطة EXPLAIN تُظهر مسحًا كاملاً للجدول على عمود يظهر في WHERE. CREATE INDEX يضيف هذا البيان فهرسًا دون إعادة إنشاء الجدول.
CREATE INDEX `id_index` ON `table_name` (`column_name`);
مثال عملي - تسريع عمليات البحث على title عمود movies الجدول:
CREATE INDEX `title_index` ON `movies` (`title`);
كل استعلام يقوم بالتصفية movies.title أصبح الآن مدعومًا بالفهرس الجديد. لا تزال الاستعلامات التي تُصفّي البيانات بناءً على أعمدة أخرى تفحص الجدول ما لم يكن لها فهرس خاص بها.
ملاحظة: يمكنك إنشاء فهرس مركب عبر أعمدة متعددة عندما تقوم استعلاماتك دائمًا بالتصفية أو الفرز بناءً على نفس التركيبة. الترتيب مهم - فالعمود الرئيسي هو الذي يحدد إمكانية استخدام الفهرس.
عرض الفهارس في الجدول
استعمل SHOW INDEXES لعرض كل فهرس مُعرّف في جدول.
SHOW INDEXES FROM `table_name`;
مثال - قائمة الفهارس على movies الجدول:
SHOW INDEXES FROM `movies`;
قم بتشغيل العبارة في MySQL طاولة العمل ضد myflixdb للاطلاع على الفهارس الموجودة والأعمدة التي تغطيها.
ملاحظة: يتم فهرسة المفاتيح الأساسية والأجنبية تلقائيًا بواسطة MySQLيحتوي كل فهرس على اسم فريد ويسرد العمود (الأعمدة) الذي يغطيه.
الصيغة: حذف الفهرس
استعمل DROP INDEX لإزالة فهرس موجود من جدول. يُفيد هذا الإجراء عندما يُصبح جدولٌ ذو عمليات كتابة مكثفة بطيئًا بسبب فهرس لم يعد يُحقق الغرض منه في عمليات القراءة.
DROP INDEX `index_id` ON `table_name`;
مثال ملموس - احذف الـ full_names فهرس من members_indexed:
DROP INDEX `full_names` ON `members_indexed`;
انواع من MySQL الفهارس
MySQL يدعم عدة أنواع من الفهارس، كل منها مناسب لحجم عمل مختلف.
| النوع | الهدف |
|---|---|
| مفتاح أساسي | معرّف صف فريد؛ يتم تجميعه مع بيانات الجدول في InnoDB. |
| فريد | يفرض التفرد مع العمل كفهرس. |
| فهرس (شجرة B) | الفهرس الثانوي الافتراضي المستخدم للاستعلامات عن النطاق وعمليات البحث عن التساوي. |
| نص كامل | مُحسَّن للبحث النصي باللغة الطبيعية باستخدام MATCH … AGAINST. |
| مكاني | فهرس R-tree لأنواع بيانات نظم المعلومات الجغرافية مثل POINT و POLYGON. |
| HASH | عمليات بحث عن المساواة في وقت ثابت؛ يستخدمها محرك تخزين الذاكرة. |
| مركب (متعدد الأعمدة) | يجمع عدة أعمدة في فهرس واحد؛ ويراعي قاعدة البادئة اليسرى. |
ممارسات لـ MySQL الفهارس
العادات التالية تحافظ على فائدة المؤشرات وتمنعها من أن تصبح عبئاً لا فائدة منه.
- فهرس لنمط الاستعلام، وليس اسم العمود: أضف الفهارس التي تتطابق مع عبارات WHERE و JOIN و ORDER BY الحقيقية، وليس "كل عمود يبدو مهمًا".
- مراقبة ترتيب المؤشر المركب: يجب أن يظهر العمود الرئيسي في الاستعلام حتى يتم استخدام الفهرس.
- تجنب الفهارس المكررة: يغطي البادئة الرئيسية للفهرس المركب بالفعل عمليات البحث في عمود واحد على تلك البادئة.
- افحص مع شرح: تأكد من أن المخطط يختار الفهرس الجديد بالفعل.
- حذف الفهارس غير المستخدمة: تستخدم
sys.schema_unused_indexesin MySQL 5.7+ للعثور على الفهارس التي لا يقرأها أي شيء. - مطابقة أنواع البيانات: إذا قارنت عبارة WHERE عمود VARCHAR برقم، فلا يمكن استخدام الفهرس بسبب التحويل الضمني.


