كل المقالات

فهارس قواعد البيانات، بمثال دليل الهاتف

قواعد البيانات · 2 دقيقة قراءة ·

كل استعلام بطيء أصلحته كان يؤول إلى نفس الصورة. تطلب من ⁨MySQL⁩ تنفيذ ⁨WHERE email = 'omar@example.com'⁩، وبدون فهرس لا تملك قاعدة البيانات سوى خيار واحد:

جدول المستخدمين · 1,000,000 صف يقرأ كل صف على حدة كأنك تبحث عن اسم في دليل الهاتف بقراءة الصفحة 1، ثم الصفحة 2، ثم الصفحة 3...
فحص كامل للجدول. مقبول عند 1,000 صف، مؤلم عند 1,000,000.

ما هو الفهرس فعليًا

الفهرس بنية ثانية مرتّبة بجانب الجدول: شجرة ⁨B-tree⁩. الأشياء المرتّبة يمكن البحث فيها بالتنصيف، فتتنقل قاعدة البيانات بقفزات لا بخطوات. نفس الاستعلام، مع فهرس على العمود ⁨email⁩:

A - Z A - M N - Z A - F G - M N - S T - Z القفزة 1 القفزة 2 القفزة 3: وُجد. ثلاث قراءات بدل المليون.
بحث ⁨B-tree⁩: كل قفزة تقلّص مساحة البحث إلى النصف أو أقل.

متى تضيف فهرسًا

  • الأعمدة الموجودة في ⁨WHERE⁩، و⁨JOIN ... ON⁩، و⁨ORDER BY⁩ لاستعلاماتك الأكثر استخدامًا.
  • المفاتيح الأجنبية، دائمًا.
  • ليس على الأعمدة التي نادرًا ما تُستخدم في الفلترة: كل فهرس يبطئ الكتابة قليلًا.
قبل التخمين، شغّل ⁨EXPLAIN⁩ على الاستعلام. إن رأيت ⁨type: ALL⁩، فتلك هي الرسمة الأولى: فحص كامل. بعد إضافة الفهرس المناسب تصبح ⁨ref⁩ أو ⁨range⁩، الرسمة الثانية.

نسبة الـ 20% تحسّن في الأداء التي حقّقتها في ⁨Getmayes⁩ كانت في معظمها هذا: قراءة مخرجات ⁨EXPLAIN⁩، رسم الشجرة، وإضافة الفهارس الأربعة التي كانت الاستعلامات تطلبها بصمت.

ملاحظات القراء

  1. لا توجد ملاحظات بعد. الأولى دائمًا الأجرأ.
تبني شيئًا مشابهًا؟ يمكنني المساعدة. تواصل