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.
علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.