پرش به مطلب اصلی

Partitioning

پارتیشن‌بندی توی دیتابیس یه جورایی مثل این می‌مونه که بخوای یه انباری خیلی بزرگ رو به چند بخش تقسیم کنی، طوری که هر بخش مخصوص یه سری از وسایل باشه. حالا چرا این کارو می‌کنیم؟ چون وقتی چیزی رو لازم داری، دیگه کل انباری رو نمی‌گردی، فقط میری همون بخشی که وسایل مرتبط توش هست، پس سریع‌تر پیدا می‌کنی.

چرا پارتیشن‌بندی مهمه؟

  1. سرعت بالا میره 🚀 – وقتی یه جدول خیلی بزرگ باشه، پیدا کردن یه رکورد توش ممکنه کند بشه. ولی اگه جدول رو به چند تکه تقسیم کنی، هر کوئری سریع‌تر اجرا می‌شه، چون فقط روی یه بخش از دیتا اجرا می‌شه، نه کل جدول.
  2. مدیریت راحت‌تر میشه – فرض کن یه جدول داری که هر روز میلیون‌ها رکورد بهش اضافه می‌شه. اگه دیتا رو ماه‌به‌ماه تو پارتیشن‌های جدا ذخیره کنی، حذف کردن اطلاعات قدیمی راحت‌تر می‌شه. مثلا می‌تونی یه پارتیشن قدیمی رو به‌راحتی حذف کنی، به‌جای این که تک‌تک رکوردها رو پاک کنی.
  3. استفاده بهینه از منابع – اگه هر پارتیشن رو روی یه سرور یا دیسک جدا بذاری، فشار روی یه نقطه کم می‌شه و عملکرد کلی سیستم بهتر می‌شه.

روش‌های پارتیشن‌بندی:

  1. اRange Partitioning (پارتیشن‌بندی محدوده‌ای) – مثلا جدول سفارشات رو بر اساس تاریخ سفارش تقسیم کنی. سفارش‌های قبل از ۲۰۲۴ تو یه پارتیشن، سفارش‌های ۲۰۲۴ تو یه پارتیشن دیگه.
  2. اList Partitioning (پارتیشن‌بندی لیستی) – مثلا کاربرای هر کشور تو یه پارتیشن جدا ذخیره بشن: ایران، آلمان، آمریکا و... 3.ا Hash Partitioning (پارتیشن‌بندی هش) – داده‌ها به‌صورت تصادفی بر اساس یه مقدار خاص (مثلا user_id) تو چند پارتیشن پخش بشن، که تعادل بینشون برقرار بشه.
  3. اComposite Partitioning (ترکیبی) – ترکیب چند روش بالا. مثلا اول دیتا رو بر اساس کشور دسته‌بندی کنی و بعدش تو هر کشور، سفارشات رو بر اساس تاریخ تقسیم کنی.

چه وقت‌هایی نباید پارتیشن‌بندی کنیم؟

  • اگه جدول خیلی کوچیکه، پارتیشن‌بندی کمکی نمی‌کنه، حتی ممکنه اوضاع رو پیچیده‌تر کنه.
  • اگه بیشتر کوئری‌ها نیاز دارن کل دیتا رو بخونن، پارتیشن‌بندی سودی نداره و حتی می‌تونه کار رو کندتر کنه.

در کل، پارتیشن‌بندی یه راه هوشمندانه برای مدیریت جداول بزرگه، ولی باید بدونی کِی و چجوری ازش استفاده کنی.

سختی در جابجایی داده‌ها 🔄

  • اگه یه داده بخواد از یه پارتیشن به یه پارتیشن دیگه بره (مثلا وقتی از Range Partitioning استفاده می‌کنی و یه رکورد قدیمی نیاز داره به یه پارتیشن جدید بره)، این انتقال ممکنه سخت و پرهزینه باشه. این هزینه بره و یه io هیت مشتی میخوره :)

فرق پارتیشن‌بندی با شاردینگ (Sharding)

هر دو باعث می‌شن که داده‌ها به چند بخش تقسیم بشن، ولی فرق‌های اساسی دارن:

ویژگیپارتیشن‌بندیشاردینگ
تعریفتقسیم یه جدول به چند بخش (پارتیشن) در یه دیتابیس واحدتقسیم کل دیتا بین چند دیتابیس جداگانه
محل ذخیره‌سازیهمه پارتیشن‌ها توی یه دیتابیس هستنهر شارد روی یه دیتابیس یا سرور جداست
هدف اصلیبهینه‌سازی کوئری‌ها و بهبود مدیریت دیتاتوزیع بار بین چند سرور برای مقیاس‌پذیری
مقیاس‌پذیریبیشتر روی بهینه‌سازی داخلی تمرکز دارهمقیاس‌پذیری افقی رو فراهم می‌کنه
کوئری‌هاکوئری‌ها هنوز به یه دیتابیس متصل هستنبرای گرفتن دیتا از چند شارد، معمولا نیاز به یک لایه مدیریت (مثل Proxy یا Application Logic) هست
مدیریتساده‌تر از شاردینگ، ولی همچنان نیاز به دقت دارهسخت‌تر و نیازمند مدیریت خودکار یا دستی