سلام
دوستان من یه پایگاه داده سنگین دارم که حدودا تو 1 جدول بالای 15 میلیون رکورد هستش . حالا بین این 15 میلیون رکورد وقتی یه یوزر داشبورد کاربریش رو باز می کنه توی پروفایل من یک حلقه foreach دارم که کارش اینه بگرده توی این 15 میلیون رکورد و 100 تا رکورد که ماله خود این یوزر هستش رو پیدا کنه و چاپ کنه هر رکورد هم عدد هستش که به یوزر ای دی طرف وصله. اما مشکلم اینجا انگار لاراول نمی تونه تایم اوت 60 ثانیه رو پر می کنه و نمی تونه دیتا ها رو بکشه از دیتابیس بیرون و حتی این زمان 60 ثانیه هم خیلی چیکار کنم به نظرتون که توی دیتابیس های سنگین میلیونی بشه از لاراول استفاده کنم ؟
@endworld
درود خوبی...
لاراول با Livewire بنویس...
من لیست کاربران را با لایو وایر نوشتم که قسمت جستجو به صورت رل تایم (Real time) هست و سریع اطلاعات رو جستجو می کند.
البته روی داده های سنگین تست نکردم.
کوئری سبک بزنید و همه داده ها لود نکن....
@endworld سلام خسته نباشید داداش mysql خوب نمیتونه این حجم از دیتا رو توی مدت زمان کم جستجو کنه و نتیجه رو سمت php.بفرسته اگه یه دیتای 15 میلیونی بزنی بعد حتی بخوای توی لوکال هاست بری توی اون جدول کلی زمان میبره که اون جدول باز بشه و همه دیتا ها خونده بشه این یعنی زمانش سمت دیتابیس هست حالا کوری زدن ممکنه زمان رو کاهش بده اما جوابش از سمت دیتابیس میاد پس بازم توی اون زمانی که دوستمون میخواد مثل 10 ثانیه فکر نکنم بشه اخه حجم خیلی زیاده و باید تک تک رکورد ها بررسی به و ردکوردی که میخواد استخراج بشه زمانبره اما توی mongodb این زمان به حداقل میرسه توی چندثانیه میتونه همه دیتا هارو هندل کنه و جواب رو بهش بده چون برای همینکار طراحی شده اما mysql برای حجم دیتای کمتری طراحی شده اما رایج تر هست برای همین از mysql استفاده میشه ولی اصولا حجم دیتای 15 میلیون رو باید با mongodb هندل کنن
@mikaiil
mongodb پایگاه داده خفنی هست و موافقم که برای داده های 1 میلیون به بالا مانگو دی بی استفاده بشه...
دوستان دقت بفرمایید که ایشون الان 15 میلیون رکورد رو داره، الان سیستمی که نوشته با mysql هست، حالا باید راه حل بدین که ایشون دقیقا چطور میتونه این مشکل رو حل کنه.
اول اینکه شما توی اون حلقه ی که میفرمایید توی 15 میلیون رکورد سرچ میزنی رو متوجه نمیشم؟
خب شما توی کنترلری که این داشبورد رو قرار برگردونه ، شما نباید همون اول درخواست رو بزنی میتونی بعد از بالا اومدن داشبورد اون درخواست رو صدا بزنی ، این با جاوا اسکریپت یا سایر کتابخانه یا فریمورک ها، خصوصا اگر لاراول کار میکنی لایووایر میتونه کمکت کنه.
public bool $loadData = false;
public function init()
{
$this->loadData = true;
}
public function render()
{
return view('livewire.visit.program',[
'products' => Product::where('user_id', auth()->user()->id)->latest()->take(10)->get(),
]);
}
<main>
//لایه و محتویات داشبورد رو اینجا لود میکنی
// این داده ها تا کامل لود نشدن این بخش به کاربر در حال لودینک نمایش میدی
// وقتی داده ها کامل شد این بخش به کاربر نمایش میده
@if ($loadData)
<div wire:init="init">
<ul>
@foreach($products as $product)
<li>{{ $product->title }}</li>
@endforeach
</ul>
</div>
@else
//یک دیو لودینک یا هرچی
@endif
</main>
در کد بالا اول صفحه داشبورد شما لود میشه، کامپونتی که داده های کاربر رو میخواد نمایش داده بشه رو توی حالت لودینگ میذاره، یعنی داده ها موقعی لود میشه که صفحه داشبورد کامل بالا اومده باشه، اینجا در وقت کاربر موقع بالا اومدن صفحه صرفه جوی میکنی و توی یک بخش لودینگ داره که داده های کاربر رو میگیره
دوم اینکه شما باید کوئری بهینه تری بزنید به فرض میخوای توی یک جدولی که میلیونی رکورد ثبت شده برای کاربر جاری یک کوئری بزنید و پس از اون دیتای یافت شده رو فورایچ بزنید پس باید به شکل زیر بنویسی که میتونی با یکسری ایتم های بیشتر به کوئری این درخواست ها رو سمت کوچکتر شدن ببری.
Product::where('user_id', auth()->user()->id)->latest()->take(10)->get();
در نهایت اینکه شما لینک آقای @juza66 موسوی رو مشاهده نکردین، ایشون با یک لینک ویدیو که آقای حسام موسوی ضبط کردن نمایش دادن برای لود داده های زیاد در صفحه میتونین از این ابزار توی لاراول استفاده کنید، که پیشنهاد میکنم براساس نیاز استفاده کنید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟