بنناجح
المرحلة 1: الـ Index من جوه · الدرس 3 من 4 · 12 دقيقة

Page Split واختيار الـ Primary Key

لما ورقة في الشجرة تتملي، الداتابيز بتقسمها. ولو الـ Primary Key عشوائي، ده بيحصل في كل مكان. الدرس ده بيوريك ليه UUIDv4 أسوأ اختيار، وتختار إيه بداله.

في الدرس ده هتتعلم
  • تفهم يعني إيه Page Split وتمنه
  • تعرف ليه الـ PK العشوائي (UUIDv4) بيبوّظ الأداء في InnoDB
  • تختار PK صح: BIGINT أو UUIDv7 أو ULID

1. Page Split

لما تيجي تضيف مفتاح في ورقة مليانة، الداتابيز بتقسمها لاتنين، كل واحدة فيها حوالي النص، وبتضيف مفتاح في الـ Node الأب. ده اسمه Page Split، وتمنه:

  • كتابة أكتر من Page بدل واحدة.
  • الورقتين الجداد نصهم فاضي، فالـ Index بيكبر ويتفرتك (Fragmentation).
  • الصفحات اللي ورا بعض منطقياً، بقت مش ورا بعض على الـ Disk.
Page Split: متسلسل ضد عشوائيجرّب بنفسك

جرّب الزرارين. نفس عدد المفاتيح، بس شوف عدد الـ Pages ونسبة الامتلاء.

2. الـ Primary Key العشوائي

وفي InnoDB الموضوع أخطر، لأن الجدول نفسه متخزن مترتب بالـ Primary Key. لو الـ PK عشوائي (UUIDv4)، كل INSERT بيروح في حتة عشوائية في الجدول كله.

3. تختار الـ PK إزاي؟

الاختيار الحجم ترتيب الإضافة الحكم
BIGINT AUTO_INCREMENT 8 bytes متسلسل ✓ الأفضل للأداء
UUIDv4 كـ CHAR(36) 36 bytes عشوائي ✗ أسوأ اختيار
UUIDv4 كـ BINARY(16) 16 bytes عشوائي ⚠️ أصغر بس لسه عشوائي
UUIDv7 / ULID 16 bytes مترتب بالوقت ✓ عالمي ومترتب

وفي Laravel:

  • $table->id() = BIGINT UNSIGNED AUTO_INCREMENT، وده الافتراضي الكويس.
  • لو محتاج UUID: HasUuids (في الإصدارات الحديثة بيولّد UUIDs مترتبة زمنياً) أو HasUlids.
  • ولو عايز ID مش متوقع يظهر للمستخدم: خلّي الـ PK رقم داخلي، واعمل عمود public_id عليه Unique Index.
علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.