یه نکته در مورد دیتابیس 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