دیتای زیاد در دیتابیس

2 هفته پیش
توسط علی بیات آپدیت شد
jalal ( 4860 تجربه )
2 هفته پیش

سلام دوستان من تعداد داده های یکی از جداولم خیلی زیاد شده به همین دلیل سرعت واکشی داده هام خیلی کمه
دوستانی chunk رو برای این کار پیشنهاد کردن
اما این تابع مقدر true برمیگردونه و داده هام رو نمیده .
دوستان اگر ممکنه یک نمونه برا گرفتن داده با استفاده از تابع chunk رو قرار بدن ممنونشون میشم .

پارسا ( 4430 تجربه )
2 هفته پیش
تخصص : برنامه نویس PHP-Laravel، طراح UI/UX

فیلد هایی ک روی اونها دارید کوئری میزنید رو ایندکس کنید مشکل حل میشه.این روش واسع رکوردهای بالا (البته نه در حد میلیون) جواب میده 👍

علی بیات ( 297017 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

به شکل زیر میتونی از chunk استفاده کنی:

DB::table('users')->chunk(100, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});

از طریق الکوئنت هم میتونی ازش استفاده کنی

jalal ( 4860 تجربه )
2 هفته پیش

@ali.bayat
گر بخواهیم با این دستوری که ارسال کردین همه کاربران رو با یه شرطی مثلا اگر is_enable==۱ برگردونیم چیکار باید بکنیم ؟

علی بیات ( 297017 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب
DB::table('users')->where('is_enable', 1)->chunk(100, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});
jalal ( 4860 تجربه )
2 هفته پیش

@ali.bayat
خب من از این دستور استفاده کردم اما کالکشنی از کاربران رو نمیده بلکه مقدار true برمیگردونه

علی بیات ( 297017 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

احتمالا باید متد get رو به انتهای کوئری اضافه کنی

jalal ( 4860 تجربه )
2 هفته پیش

@ali.bayat
نه متاسفانه باز هم کالکشن برنمیگردونه

علی بیات ( 297017 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

کدتون رو قرار بدید

jalal ( 4860 تجربه )
2 هفته پیش

@ali.bayat


Route::get('/all', function () {
    return \DB::table('users')->where('is_enable',1)->chunk(100, function($users)
    {
        foreach ($users as $user)
        {
            //
        }
    })->get();
});
jalal ( 4860 تجربه )
2 هفته پیش

@ali.bayat
البته کد بالا خطا میده .

You must specify an orderBy clause when using this function.
علی بیات ( 297017 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

ببینید وقتی ما از get استفاده میکنیم .. اون موقع هست که کالکشن برای ما بر میگرده و سپس میتونیم با chunk نتایج رو بخش بخش کنیم.

پس کدت باید شبیه زیر باشه:

DB::table('users')
    ->get()
    ->chunk(2, function($users){ 
        foreach ($users as $userSet) { 
            var_dump($userSet); 
        } 
    });
jalal ( 4860 تجربه )
2 هفته پیش

@ali.bayat
درست میفرمایین اما من میخواستم این chunk داخل دیتا بیس اتفاق بیفته چون تعداد رکورد ها زیاد هستن زمان زیادی طول میکشه داده هام و بگیرم .
پیشنهادی که کرده بودن این بود که کوئری هر چقد به تعداد کوچکتر تقسیم بشه سرعت واکشی بالا میره و این کار با chunk امکان پذیر هست .

علی بیات ( 297017 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

chunk رو باید روی یه Collection استفاده کرد..
نه روی Instance کلاس QueryBuilder


اما برای کاری که شما می‌خواهی انجام بدی
میشه از limit و یا take استفاده کرد.
مثلا:

User::where(...)->take(100);

چنین کوئری میسازه:

select * from users where ... LIMIT 100;

همچنین میتونی از Lazy Collection ها هم (ار نسخه ۶ و ۶ به بعد لاراول) استفاده کنی.

برای ارسال پاسخ باید وارد سایت شوید