راکت

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

13 پاسخ

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

ثبت پرسش جدید

پاسخ‌ها

13
پارسا
پارسا
@parsavdst

تخصص: برنامه نویس PHP-Laravel، طراح UI/UX

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

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

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

شاید پاسخ شما همین‌جا باشد

ronald
ronald
@crireal5

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

DB::table('users')->where('is_enable', 1)->chunk(100, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});
ronald
ronald
@crireal5

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

ronald
ronald
@crireal5

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

ronald
ronald
@crireal5

@ali.bayat


Route::get('/all', function () {
    return \DB::table('users')->where('is_enable',1)->chunk(100, function($users)
    {
        foreach ($users as $user)
        {
            //
        }
    })->get();
});
ronald
ronald
@crireal5

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

You must specify an orderBy clause when using this function.
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

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

DB::table('users')
    ->get()
    ->chunk(2, function($users){ 
        foreach ($users as $userSet) { 
            var_dump($userSet); 
        } 
    });
ronald
ronald
@crireal5

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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


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

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

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

select * from users where ... LIMIT 100;

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

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام