统计销售最多的商品实现方法

订单表如下

id good_id price amount subtotal deleted_at
1 12 12.00 10 120.00 NULL
2 12 12.00 10 120.00 NULL
3 12 12.00 10 120.00 NULL
4 12 12.00 10 120.00 NULL
5 11 1.00 2 2.00 NULL
5 11 1.20 10 12.00 NULL

统计出售量最多的商品

我的实现方法

$res = Good::where('deleted_at', null)
            ->selectRaw('count(good_id) as count_good, good_id')
            ->groupBy('good_id')
            ->with(['good' => function ($query) {
                return $query->select('id', 'goods_name');
            }])
            ->orderBy('count_good', 'desc')
            ->get()
            ->toArray();

   dd($res);

返回结果

[
    [
        "count_good" => 4,
        "good_id" => 12,
        "good" => [
            "id" => 12,
            "goods_name" => "香蕉"
        ]
    ],
    [
        "count_good" => 2,
        "good_id" => 11,
        "good" => [
            "id" => 11,
            "goods_name" => "苹果"
        ]
    ]
]

在这个实现方法配合 (定时任务 + Supervisor) 每天凌晨执行统计前一天的销售结果存起来,当需要是,直接返回。

现在有个疑问,如果数据在上100万的时候,上面的实现方法影响性能吗?有没有比较好的实现方法?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
leo
最佳答案

100W 对 MySQL 来说就是一个小表

4年前 评论
leo (作者) 4年前
会尿尿的大鲨鱼 (楼主) 4年前
会尿尿的大鲨鱼 (楼主) 4年前
讨论数量: 6
leo

100W 对 MySQL 来说就是一个小表

4年前 评论
leo (作者) 4年前
会尿尿的大鲨鱼 (楼主) 4年前
会尿尿的大鲨鱼 (楼主) 4年前
巴啦啦

可以在商品表中加字段记录

4年前 评论
会尿尿的大鲨鱼 (楼主) 4年前

订单千万级的时候,可以考虑将订单数据同步到mongodb,它的map reduce 对于这种统计完全没有问题,而且对于数据搜索可以放到mongdb,不需要搜mysql的表。mysql可以通过bin-log 日志同步到mongodb。

4年前 评论
会尿尿的大鲨鱼 (楼主) 4年前
宇宙最厉害

谨慎使用 toArray() 会导致内存溢出,最好再加个异常通知,内存也分配高点。

4年前 评论

@沈益飞 这个真的不知道内存溢出。不过我很少用数组,都是用对象多一点。

4年前 评论
GanymedeNil

100w 基本没太大问题,量大了你们坑定就会有数据部门了,他们会有更专业的处理方式

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!