php - laravel 数据表加载数据需要很长时间

标签 php mysql laravel performance laravel-datatables

我正在尝试使用以下代码将数据库表显示到 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 条记录时,难怪需要很长时间。

虽然您在呈现页面时只显示有限数量的记录,但从技术上讲,查询会在页面加载时获取所有记录。

需要采取行动

  1. 最小化以下部分:

->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 有回调函数.

  1. 使用 laravel 分页和排序代替 datatables,这将在服务器端执行,控制在页面加载时加载大量数据。

  2. 尝试实现基于日期或其他可能的过滤器。

关于php - laravel 数据表加载数据需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478823/

相关文章:

mysql - SQL 查询返回行数,直到满足特定条件

python - 在 makefile 中使用变量

php - Laravel 使用不同的队列连接来调度作业

php - 使用 PHP PDO 语句的 SQL 通配符字符列表

php - 在没有超链接的情况下用超链接替换文本

PhpMailer SMTP 通知 : EOF caught while checking if connected

php - 没有重复记录的内部连接

php - 如何使用php在数据库中插入动态添加的表单字段

javascript - 使用单选按钮数组的文本框可见性

php - Laravel 依赖注入(inject)与继承