Как сократить время загрузки Извлечение большой таблицы базы данных с более чем 12 000 строк в laravel - PullRequest
0 голосов
/ 09 марта 2020

Привет,

У меня есть таблица «подписчиков» в моей БД, содержащая более 12 000 строк, и число постепенно увеличивается. Когда я открываю представление подписчика в браузере, загрузка всех данных занимает минуту или более, а затем организуется разбиение на страницы в таблице данных.

Вот мой код SubscribeersController

public function index()
    {
        $subscribers = DB::table('subscribers')->get();
        return view('subscribers')->with('subscribers',$subscribers);
    }

Есть ли способ повысить производительность загрузки страницы?
Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 09 марта 2020

У меня похожая проблема, и я решил ее, используя composer require yajra/laravel-datatables-oracle:"~9.0". С помощью datatables вы можете использовать серверную загрузку, которая займет около 5 секунд для загрузки 15000 записей.

Сначала установите пакет, следуя инструкциям: install yajra / datatables .

Во-вторых, установите маршрут к функции, которая будет извлекать данные в контроллере, например:

Route::get('/subscribers/render-subscribers-datatable', 'SubscribersController@render_subscribers_datatable')->name('render_subscribers_datatable')->middleware('auth');

В-третьих, настройте объект данных в представлении для получения и обработки данных, например:

$('#subscribers').DataTable({
    responsive: true,
    processing: true,
    deferRender: true,
    serverSide: true,
    bLengthChange: false,
    searchDelay: 500,
    pageLength: 10,
    ajax: '{{ route('render_subscribers_datatable') }}',
    columns: [
        { data: 'active', orderable: false, searchable: false, className: "text-center"},
        { data: 'client_name' },
        { data: 'date_of_birth' },
        { data: 'personal_id_number' },
        { data: 'partner_number' },
        { data: 'phone' },
        { data: 'delivery_address' },
        { data: 'email' },
        { data: 'action', orderable: false, searchable: false, className: "text-center"},
    ],
});

Правильно сконфигурируйте столбцы для вашего проекта ...

Далее, отработайте контроллер, как:

public function render_subscribers_datatable(Request $request)
{
    // Check if Request Came From Ajax
    if($request->ajax())
    {
        // Get data
        $dump = DB::table('tbl_subscribers')->select()->get();

        // Return datatable
        return Datatables::of($dump)->make(true);
    }

    // Else, redirect
    // redirect with message
    return redirect()->route('home')->with('error', 'cant process the request.');
}

Надеюсь, это помогло.

0 голосов
/ 09 марта 2020

Вместо использования $subscribers = DB::table('subscribers')->get();, вы должны использовать

$subscribers=DB::table('subscribers')>paginate(numbers_of_row_you_want_to_retrive e.g 10);

Это позволит получить только 10 (для этого примера) записей из базы данных одновременно. Вы можете использовать {{ $subscribers->links() }} для разбивки данных на странице просмотра. Каждая страница будет содержать 10 записей (для этого примера), и вы можете пролистывать страницы, чтобы получить другие записи.

0 голосов
/ 09 марта 2020

Используйте нумерацию страниц. Я думаю, вам не нужно загружать все записи 12k одновременно.

Посмотрите здесь: https://laravel.com/docs/5.8/pagination

Ваш код должен выглядеть следующим образом:

public function index(){
    $subscribers = DB::table('subscribers')->paginate(100);
    return view('subscribers')->with('subscribers',$subscribers);
}

Это будет загружать только 100 подписчиков одновременно и у вас будет доступ к следующим и предыдущим записям.

Надеюсь, это поможет вам

...