سلام آقای خسروجردی، خسته نباشید.
اگه ظرفیت یک جدول از دیتابیس پر بشه و دیگه جا نداشته باشه برای ثبت رکورد جدید باید چیکار کنیم؟
سلام وقت بخیر
ظرفیت جدول دیتابیس توی لاراول یا هر فریمورک دیگه معمولاً محدود به حجم دیسک یا نوع ستونهاست، نه خود جدول.
راهکار:
اگر ستون id از نوع INT هست و پر شده (رسیده به ۲,۱۴۷,۴۸۳,۶۴۷)، باید نوع ستون رو تغییر بدید به BIGINT.
اگر فضای دیسک پر شده، باید فضای سرور رو افزایش بدید
اگر محدودیت دیگهای هست (مثلاً تعداد رکورد)، باید بررسی و مدیریت رکوردها (آرشیو، حذف دادههای قدیمی) انجام بدید
منظور من اینه که مثلا ستون id از نوع BIGINT هست و تعداد رکورد هایی که کاربران ثبت کردن بالا رفته و جدول پر شده داخل این مورد باید چیکار کنیم؟
اگر ستون id از نوع BIGINT باشه (ظرفیت حدود ۹ کوادریلیون رکورد)، عملاً پر شدن جدول خیلی نادره.
اما اگه واقعاً تعداد رکوردها خیلی زیاد شده:
آرشیو کردن رکوردهای قدیمی به جدول جداگانه یا دیتابیس دیگر
پارتیشنبندی جدول برای بهبود عملکرد و مدیریت بهتر دادهها
حذف دادههای غیرضروری یا موقت
در موارد خاص، شکستن جدول به چند جدول مرتبط هم میتونه کمک کنه
ببخشید
1. در مورد (آرشیو کردن رکوردهای قدیمی به جدول جداگانه یا دیتابیس دیگر) چجوری میتونیم آرشیو کنیم به یک دیتابیس دیگه و اگه آرشیو کنیم به یک دیتابیس دیگه، چجوری میتونیم داده های یک جدول رو از 2 تا دیتابیس بخونیم؟
2. پارتیشن بندی جدول رو چجوری باید انجام بدیم؟
میشه برای این 2 مورد با یک مثال و کد توضیح بدید.
ابتدا اتصال پایگاه داده دوم را در فایل config/database.php و .env تعریف کنید.
برای جدول آرشیو، یک مدل جدید ایجاد کرده و در آن مقدار protected $connection را برابر با نام اتصال جدید قرار دهید.
دادههای قدیمی را با متدهایی مانند create() در پایگاه داده جدید درج و سپس از پایگاه داده اصلی حذف کنید.
جهت خواندن دادهها از هر دو منبع، از کدی مانند زیر استفاده میشود:
$allUsers = User::all()->merge(ArchivedUser::all());
در صورتی که حجم دادهها زیاد باشد، پارتیشنبندی سبب بهبود عملکرد میشود. نمونهای از پارتیشنبندی بر اساس سال:
CREATE TABLE logs (
id BIGINT,
created_at DATETIME
)
PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
چند تا سوال داشتم:
1. آیا کد مربوط به پارتیشن بندی
PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
رو باید در مسیر مثلا database/migrations/2023_10_02_173850_create_banners_table تعریف کنیم؟
2. کد زیر
PARTITION p2023 VALUES LESS THAN (2024)
- چیکار میکنه؟
- یعنی ما اگه می خوایم پارتیشن بندی کنیم باید براساس یکی از ستون های جدول باشه؟
- آیا می تونیم به جای این خط کد، چیز دیگه ای بنویسیم؟