【问题标题】:How to reduce load time Retrieving large database table with 12,000+ rows in laravel如何减少加载时间在 laravel 中检索超过 12,000 行的大型数据库表
【发布时间】:2020-06-21 07:01:33
【问题描述】:

您好,

我的数据库中有一个“订阅者”表,有超过 12,000 行,并且数量正在逐渐增加。 当我在浏览器中打开订阅者视图时,需要一分钟或更长时间才能加载所有数据,然后在数据表中安排分页。

这是我的 SubscribersController

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

有什么方法可以提高页面加载的性能。
提前致谢!

【问题讨论】:

  • 使用分页只加载一部分文件?你真的需要一次加载 12k 个条目吗?

标签: mysql laravel eloquent database-performance laravel-5.8


【解决方案1】:

我有一个类似的问题,我使用composer require yajra/laravel-datatables-oracle:"~9.0" 解决了它。使用数据表,您可以使用服务器端加载,加载 15000 条记录大约需要 5 秒。

首先,按照指南安装软件包:install yajra/datatables

其次,为将在控制器中检索数据的函数设置路由,例如:

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

三、在视图中配置datatable获取和处理数据,如:

$('#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.');
}

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    使用分页。我认为您不需要一次加载所有 12k 记录。

    看看这里:https://laravel.com/docs/5.8/pagination

    您的代码应如下所示:

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

    这一次只会加载 100 个订阅者,您将可以访问下一个和上一个记录。

    希望对你有帮助

    【讨论】:

    • 您好,感谢您的回答。我之前已经查看过这个解决方案,但问题是,我必须一次加载所有订阅者。
    • 你能告诉我是什么原因吗?也许还有另一种解决方案
    【解决方案3】:

    您应该使用

    ,而不是使用$subscribers = DB::table('subscribers')->get();

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

    这一次只会从数据库中检索 10 个(对于此示例)条目。 您可以使用{{ $subscribers->links() }} 对视图页面中的数据进行分页。每个页面将包含 10 个条目(对于本示例),您可以循环浏览页面以获取其他条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2012-10-09
      • 2013-10-08
      相关资源
      最近更新 更多