如何减少加载时间在 laravel 中检索包含 12,000 多行的大型数据库 table
How to reduce load time Retrieving large database table with 12,000+ rows in laravel
你好,
我的数据库中有一个 'subscribers' table,有超过 12,000 行,并且该数字正在逐渐增加。
当我在浏览器中打开订阅者视图时,需要一分钟或更长时间才能加载所有数据,然后在数据中安排分页table。
这是我的 SubscribersController
代码
public function index()
{
$subscribers = DB::table('subscribers')->get();
return view('subscribers')->with('subscribers',$subscribers);
}
有什么可以提高页面加载性能的吗
提前致谢!
使用分页。我认为您不需要一次加载所有 12k 条记录。
看这里:https://laravel.com/docs/5.8/pagination
您的代码应如下所示:
public function index(){
$subscribers = DB::table('subscribers')->paginate(100);
return view('subscribers')->with('subscribers',$subscribers);
}
这一次只会加载 100 个订阅者,您将可以访问下一个和以前的记录。
希望对您有所帮助
而不是使用 $subscribers = DB::table('subscribers')->get();
,你应该使用
$subscribers=DB::table('subscribers')>paginate(numbers_of_row_you_want_to_retrive e.g 10);
这一次只会从数据库中检索 10 个(对于此示例)条目。
您可以使用 {{ $subscribers->links() }}
对视图页面中的数据进行分页。每个页面将包含 10 个条目(对于此示例),您可以循环浏览页面以获取其他条目。
我有一个类似的问题,我使用 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.');
}
希望对您有所帮助。
你好,
我的数据库中有一个 'subscribers' table,有超过 12,000 行,并且该数字正在逐渐增加。
当我在浏览器中打开订阅者视图时,需要一分钟或更长时间才能加载所有数据,然后在数据中安排分页table。
这是我的 SubscribersController
代码public function index()
{
$subscribers = DB::table('subscribers')->get();
return view('subscribers')->with('subscribers',$subscribers);
}
有什么可以提高页面加载性能的吗
提前致谢!
使用分页。我认为您不需要一次加载所有 12k 条记录。
看这里:https://laravel.com/docs/5.8/pagination
您的代码应如下所示:
public function index(){
$subscribers = DB::table('subscribers')->paginate(100);
return view('subscribers')->with('subscribers',$subscribers);
}
这一次只会加载 100 个订阅者,您将可以访问下一个和以前的记录。
希望对您有所帮助
而不是使用 $subscribers = DB::table('subscribers')->get();
,你应该使用
$subscribers=DB::table('subscribers')>paginate(numbers_of_row_you_want_to_retrive e.g 10);
这一次只会从数据库中检索 10 个(对于此示例)条目。
您可以使用 {{ $subscribers->links() }}
对视图页面中的数据进行分页。每个页面将包含 10 个条目(对于此示例),您可以循环浏览页面以获取其他条目。
我有一个类似的问题,我使用 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.');
}
希望对您有所帮助。