💣 یه نکته در مورد دیتابیس mysql/mariadb روی scale

:bomb: یه نکته در مورد دیتابیس mysql/mariadb روی scale

یه سری جداول داریم، تخمین مون اینه که خیلی تعداد رکوردهاش زیاد میشه، مثلا شاید به ماهی ۵۰ تا ۱۰۰ میلیون رکورد برسه

نکته دیگه اینه که این رکوردهارو موقت احتیاج داریم تو دیتابیس ذخیره کنیم، و بعد از مثلا چند هفته دیگه به رکوردهای قدیمی احتیاجی نداریم

خب دنبال راه حل بودیم که حجم دیتابیس رو مدیریت کنیم

راه حل اول: بیایم یه job بنویسیم که هر چند وقت یکبار بره رکوردهای قدیمی رو از جدول مورد نظر پاک کنه

نتیجه: جواب نمیده!!!

دو تا مشکل داریم، یک اینکه وقتی تو دیتابیس mysql ما رکوردی رو حذف می کنیم، فضای دیسک اشغال شده برای اون رکورد پس داده نمیشه، بلکه برای ذخیره کردن رکورد جدید ازش مجددا استفاده میشه

این دوتا مشکل ایجاد میکنه

یک اینکه فضای دیسک اشغال شده حتی با وجود حذف رکوردهای قدیمی همیشه در حال افزایش هست و هیچوقت کم نمیشه

دوم اینکه مشکل data fragmentation بوجود میاد که performance رو برای read کردن بد میکنه

راه حل دوم: استفاده از partitioning

ما میتونیم دیتارو shard کنیم و در partitionهای مختلف نگه داری کنیم

برای partition کردن سیاست های مختلفی میشه در نظر گرفت، مثلا بر اساس تعداد رکورد (همون id اگه bigint هست) یا براساس create_time (این خیلی توصیه نمیشه)

خوبیش این میشه که وقتی partition میکنی، هر وقت که دیتاهای قدیمی رو لازم نداشتی، میتونی براحتی partitionهای قدیمی رو delete کنی، اینطوری فضای دیسک خالی میشه، مشکل data fragmentation هم بوجود نمیاد

خوشحال میشم اگه تجربه مشابهی دارید، یا پیشنهادی دارید، تو کامنت ها بنویسید

کامنت هایی که نکات خوبی رو اشاره کردند، اینجا لیست می‌کنم

https://t.me/c/1525472919/1552

https://t.me/c/1525472919/1529

https://t.me/c/1525472919/1551

https://t.me/c/1525472919/1553

https://t.me/c/1525472919/1531

https://t.me/c/1525472919/1529

https://t.me/c/1525472919/1532