我正在尝试使用以下代码将数据库表显示到 laravel 数据表,但 laravel 数据表需要很长时间才能加载数据。 我在数据库中有大约 700000 条记录。如何减少加载数据的时间?
代码
web.php
Route::get('home', 'HomeController@index')->name('home');
HomeController.php
public function index()
{
$campaigns = TonicData::select('campaign')->distinct()->get();
if (request()->ajax()) {
$data = \DB::table('tonic_data')
->whereNotNull('subid4')
->where('subid4', '!=', '')
->select('subid4')
->groupBy('subid4')
->selectRaw('sum(view) as sum_of_views, sum(term_view) as sum_of_term_views,
sum(add_click) as sum_of_add_click, sum(revenue_usd) as sum_of_revenue,
(sum(revenue_usd)/sum(view)*1000) as rpm')
->when((request()->has('selectedCampaign') && request()->get('selectedCampaign') != ''), function ($query) {
$query->whereIn('campaign', request()->get('selectedCampaign'));
})
->when((request()->has('selectedDateRange') && request()->get('selectedDateRange') != ''), function ($query) {
$query->whereBetween('day_date', [request()->get('selectedDateRange')['fromDate'], request()->get('selectedDateRange')['toDate']]);
});
return DataTables::of($data)
->addIndexColumn()
->make();
}
return view('dashboard', compact('campaigns'));
}
dashboard.blade.php
<script type="text/javascript">
$(document).ready(function() {
$('#datatable').dataTable({
responsive: true,
processing: true,
serverSide: true,
ajax: '{{ route('home') }}',
columns: [
{data: 'DT_RowIndex', orderable: false, searchable: false},
{data: 'subid4', name: 'subid4'},
{data: 'sum_of_views', name: 'sum_of_views', searchable: false},
{data: 'sum_of_term_views', name: 'sum_of_term_views', searchable: false},
{data: 'sum_of_add_click', name: 'sum_of_add_click', searchable: false},
{data: 'sum_of_revenue', name: 'sum_of_revenue', searchable: false},
{data: 'rpm', name: 'rpm', searchable: false}
]
});
});
</script>
sql代码
query 1:
select count(*) as aggregate
from ( SELECT `subid4`,
sum(view) as sum_of_views,
sum(term_view) as sum_of_term_views,
sum(add_click) as sum_of_add_click,
sum(revenue_usd) as sum_of_revenue,
(sum(revenue_usd)/sum(view)*1000) as rpm
from `tonic_data`
where `subid4` is not null
and `subid4` != ?
group by `subid4`
) count_row_table
query 2:
select `subid4`, sum(view) as sum_of_views, sum(term_view) as sum_of_term_views,
sum(add_click) as sum_of_add_click, sum(revenue_usd) as sum_of_revenue,
(sum(revenue_usd)/sum(view)*1000) as rpm
from `tonic_data`
where `subid4` is not null
and `subid4` != ?
group by `subid4`
limit 10 offset 0
提前致谢!
最佳答案
总结讨论,当您的查询尝试一次获取所有 700k 条记录时,难怪需要很长时间。
虽然您在呈现页面时只显示有限数量的记录,但从技术上讲,查询会在页面加载时获取所有记录。
需要采取行动
- 最小化以下部分:
->selectRaw('sum(view) as sum_of_views, sum(term_view) as sum_of_term_views,
sum(add_click) 作为 sum_of_add_click,sum(revenue_usd) 作为 sum_of_revenue,
(sum(revenue_usd)/sum(view)*1000) as rpm')
与其动态地汇总所有这些值,不如维护一个单独的表并在 tonic_data
中的任何记录发生更改时存储所有这些值。根据 this answer 有回调函数.
使用 laravel 分页和排序代替
datatables
,这将在服务器端执行,控制在页面加载时加载大量数据。尝试实现基于日期或其他可能的过滤器。
关于php - laravel 数据表加载数据需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478823/