MySQL: أساسيات فهارس MySQL: الإنشاء والإدارة

آخر تحديث: 2026-08-26

تعد الفهارس عنصراً أساسياً لتحسين أداء قاعدة البيانات — فالاستعلام الذي يفتقر إلى فهرس يشبه البحث عن كلمة في القاموس دون الرجوع إلى فهرس المحتويات.

يشرح هذا الدرس المبادئ التي تقوم عليها الفهارس، بالإضافة إلى كيفية إنشائها وإدارتها.

1. ما ستتعلمه



2. سيناريوهات واقعية

(1) المشكلة: الاستعلامات بطيئة للغاية

مليون سجل مستخدم، البحث حسب عنوان البريد الإلكتروني:

SQL
SELECT * FROM users WHERE email = 'alice@email.com';
-- Execution time: 2.5 seconds (Full Table Scan)

(2) حلول للفهارس

SQL
CREATE INDEX idx_email ON users(email);
-- Search again: 0.003 seconds (Index Lookup)
البعد غير مفهرس مفهرس
طريقة الاستعلام المسح الكامل للجدول البحث في شجرة B+
استعلام يحتوي على مليون صف 2–5 ثوانٍ < 0.01 ثانية
أداء الكتابة لا توجد أعباء إضافية أبطأ قليلاً (تتطلب صيانة الفهرس)


3. كيف تعمل الفهارس

(1) بنية شجرة B+

100%
graph TB
    R[Root Node<br/>10 | 30 | 50] --> L1[1-10]
    R --> L2[11-30]
    R --> L3[31-50]
    R --> L4[51+]
    L1 --> D1[Data: 1,3,5,7,9]
    L1 --> D2[Data: 2,4,6,8,10]
    L2 --> D3[Data: 11,15,20]
    L2 --> D4[Data: 25,28,30]
    L3 --> D5[Data: 31,35,40]
    L3 --> D6[Data: 45,48,50]

(2) أنواع الفهارس

النوع الوصف حالات الاستخدام
فهرس شجرة B+ نوع الفهرس الافتراضي متساوي/نطاق/مرتب
فهرس التجزئة جدول التجزئة استعلام المساواة (محرك الذاكرة)
فهرس النص الكامل البحث النصي البحث في محتوى المقالات
الفهرس المكاني بيانات نظم المعلومات الجغرافية استعلام تحديد الموقع الجغرافي


4. إنشاء الفهارس

▶ مثال: إنشاء فهرس

SQL
-- Methods1:CREATE INDEX
CREATE INDEX idx_email ON users(email);

-- Unique Index
CREATE UNIQUE INDEX idx_email ON users(email);

-- Methods2:ALTER TABLE
ALTER TABLE users ADD INDEX idx_username (username);

-- Composite Index(Composite Index)
CREATE INDEX idx_name_email ON users(username, email);

-- Prefix Index
CREATE INDEX idx_email_prefix ON users(email(10));
▶ جرّب الكود

5. عرض الفهرس

▶ مثال: عرض معلومات الفهرس

SQL
-- View all indexes on the table
SHOW INDEX FROM users;

-- View Index Information
SHOW INDEX FROM users\G
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
+-------+------------+----------+--------------+-------------+
| Table | Key_name   | Seq_in_index | Column_name | Index_type |
+-------+------------+--------------+-------------+------------+
| users | PRIMARY    |            1 | id          | BTREE      |
| users | idx_email  |            1 | email       | BTREE      |
+-------+------------+--------------+-------------+------------+


6. حذف فهرس

▶ مثال: حذف فهرس

SQL
-- Methods1:DROP INDEX
DROP INDEX idx_email ON users;

-- Methods2:ALTER TABLE
ALTER TABLE users DROP INDEX idx_email;

-- Delete Primary Key
ALTER TABLE users DROP PRIMARY KEY;
▶ جرّب الكود

7. حالات استخدام الفهارس

السيناريو هل ينبغي إنشاء فهرس؟ السبب
حقل شرط WHERE تسريع الاستعلام
حقل JOIN ربط مُسرَّع
حقل «الترتيب حسب» تجنب الترتيب
حقل التجميع التجميع السريع
مجال انتقائي للغاية تمييز عالٍ
تحديثات ميدانية متكررة تكاليف صيانة مرتفعة
الحقول ذات الانتقائية المنخفضة مثل الجنس (ذكر/أنثى)
الجداول التي تحتوي على كميات صغيرة من البيانات المسح الكامل للجدول أسرع


❓ أسئلة شائعة

س هل من الأفضل وجود عدد أكبر من الفهارس؟
ج لا. فالفهارس تشغل مساحة وتقلل من أداء الكتابة. لذا، لا تنشئ الفهارس إلا على الحقول التي يتم الاستعلام عنها بشكل متكرر.
س هل يتم فهرسة المفاتيح الأساسية تلقائيًا؟
ج نعم. يقوم المفتاح الأساسي (PRIMARY KEY) تلقائيًا بإنشاء فهرس مجمَّع، بينما يقوم المفتاح الفريد (UNIQUE) تلقائيًا بإنشاء فهرس فريد.
س كيف يمكنني تحديد ما إذا كان هناك حاجة إلى فهرس؟
ج استخدم EXPLAIN لتحليل خطة الاستعلام ومعرفة ما إذا كان هناك فهرس مستخدم أم لا.
س هل من الأفضل وجود عدد أكبر من الفهارس؟
ج لا. تؤدي الفهارس إلى إبطاء أداء الكتابة، لذا يُنصح بألا يزيد عدد الفهارس في الجدول الواحد عن 5–6 فهارس.
س هل المفتاح الأساسي هو دائمًا فهرس مجمَّع؟
ج في InnoDB، نعم — المفتاح الأساسي هو فهرس مجمَّع. أما في MyISAM، فإن المفتاح الأساسي هو فهرس غير مجمَّع.

📖 ملخص


📝 تمارين

  1. سؤال أساسي (درجة الصعوبة ⭐): أنشئ فهرسًا فريدًا على الحقل email في الجدول users.

  2. مشكلة متقدمة (درجة الصعوبة ⭐⭐): أنشئ فهرسًا مركبًا (department, salary) وتحقق من مبدأ البادئة الموجودة في أقصى اليسار.

  3. سؤال التحدي (مستوى الصعوبة: ⭐⭐⭐): استخدم EXPLAIN لمقارنة الفروق في الأداء بين الاستعلامات التي تستخدم الفهارس وتلك التي لا تستخدمها.

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%