Partitioning
پارتیشنبندی توی دیتابیس یه جورایی مثل این میمونه که بخوای یه انباری خیلی بزرگ رو به چند بخش تقسیم کنی، طوری که هر بخش مخصوص یه سری از وسایل باشه. حالا چرا این کارو میکنیم؟ چون وقتی چیزی رو لازم داری، دیگه کل انباری رو نمیگردی، فقط میری همون بخشی که وسایل مرتبط توش هست، پس سریعتر پیدا میکنی.
چرا پارتیشنبندی مهمه؟
- سرعت بالا میره 🚀 – وقتی یه جدول خیلی بزرگ باشه، پیدا کردن یه رکورد توش ممکنه کند بشه. ولی اگه جدول رو به چند تکه تقسیم کنی، هر کوئری سریعتر اجرا میشه، چون فقط روی یه بخش از دیتا اجرا میشه، نه کل جدول.
- مدیریت راحتتر میشه – فرض کن یه جدول داری که هر روز میلیونها رکورد بهش اضافه میشه. اگه دیتا رو ماهبهماه تو پارتیشنهای جدا ذخیره کنی، حذف کردن اطلاعات قدیمی راحتتر میشه. مثلا میتونی یه پارتیشن قدیمی رو بهراحتی حذف کنی، بهجای این که تکتک رکوردها رو پاک کنی.
- استفاده بهینه از منابع – اگه هر پارتیشن رو روی یه سرور یا دیسک جدا بذاری، فشار روی یه نقطه کم میشه و عملکرد کلی سیستم بهتر میشه.
روشهای پارتیشنبندی:
- اRange Partitioning (پارتیشنبندی محدودهای) – مثلا جدول سفارشات رو بر اساس تاریخ سفارش تقسیم کنی. سفارشهای قبل از ۲۰۲۴ تو یه پارتیشن، سفارشهای ۲۰۲۴ تو یه پارتیشن دیگه.
- اList Partitioning (پارتیشنبندی لیستی) – مثلا کاربرای هر کشور تو یه پارتیشن جدا ذخیره بشن: ایران، آلمان، آمریکا و...
3.ا Hash Partitioning (پارتیشنبندی هش) – دادهها بهصورت تصادفی بر اساس یه مقدار خاص (مثلا
user_id
) تو چند پارتیشن پخش بشن، که تعادل بینشون برقرار بشه. - اComposite Partitioning (ترکیبی) – ترکیب چند روش بالا. مثلا اول دیتا رو بر اساس کشور دستهبندی کنی و بعدش تو هر کشور، سفارشات رو بر اساس تاریخ تقسیم کنی.
چه وقتهایی نباید پارتیشنبندی کنیم؟
- اگه جدول خیلی کوچیکه، پارتیشنبندی کمکی نمیکنه، حتی ممکنه اوضاع رو پیچیدهتر کنه.
- اگه بیشتر کوئریها نیاز دارن کل دیتا رو بخونن، پارتیشنبندی سودی نداره و حتی میتونه کار رو کندتر کنه.
در کل، پارتیشنبندی یه راه هوشمندانه برای مدیریت جداول بزرگه، ولی باید بدونی کِی و چجوری ازش استفاده کنی.
سختی در جابجایی دادهها 🔄
- اگه یه داده بخواد از یه پارتیشن به یه پارتیشن دیگه بره (مثلا وقتی از
Range Partitioning
استفاده میکنی و یه رکورد قدیمی نیاز داره به یه پارتیشن جدید بره)، این انتقال ممکنه سخت و پرهزینه باشه. این هزینه بره و یه io هیت مشتی میخوره :)
فرق پارتیشنبندی با شاردینگ (Sharding)
هر دو باعث میشن که دادهها به چند بخش تقسیم بشن، ولی فرقهای اساسی دارن:
ویژگی | پارتیشنبندی | شاردینگ |
---|---|---|
تعریف | تقسیم یه جدول به چند بخش (پارتیشن) در یه دیتابیس واحد | تقسیم کل دیتا بین چند دیتابیس جداگانه |
محل ذخیرهسازی | همه پارتیشنها توی یه دیتابیس هستن | هر شارد روی یه دیتابیس یا سرور جداست |
هدف اصلی | بهینهسازی کوئریها و بهبود مدیریت دیتا | توزیع بار بین چند سرور برای مقیاسپذیری |
مقیاسپذیری | بیشتر روی بهینهسازی داخلی تمرکز داره | مقیاسپذیری افقی رو فراهم میکنه |
کوئریها | کوئریها هنوز به یه دیتابیس متصل هستن | برای گرفتن دیتا از چند شارد، معمولا نیاز به یک لایه مدیریت (مثل Proxy یا Application Logic) هست |
مدیریت | سادهتر از شاردینگ، ولی همچنان نیاز به دقت داره | سختتر و نیازمند مدیریت خودکار یا دستی |