惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
U
Unit 42
腾讯CDC
D
Docker
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
I
InfoQ
Jina AI
Jina AI
爱范儿
爱范儿
宝玉的分享
宝玉的分享
博客园 - Franky
G
Google Developers Blog
P
Proofpoint News Feed

博客园 - zh7314

Go 1.23 → 1.26 升级检查文档 Pimcore 版本功能对比表(Community / Professional / Enterprise) typephp的编译核心phpx原理解析 typephp的编译原理 golang多版本控制工具支持Linux/macOS/Windows dbx低性能消耗的支持window/mac/docker的数据库客户端 关于headless和低代码平台的一些思考 docker日志监控dozzle,高性能,性能消耗小 pimcore 12版本的命令 阿里云 nas服务挂了导致docker挂载目录不存,docker无法重启和停止容器 symfony+swoole性能测试 关于小米手机使用 microsoft authenticator 无法扫码成功的解决方案 fastapi的构建cms,推荐fastapi集成框架 s3rius/FastAPI-template python 现代化包管理工具uv安装和使用 博文阅读密码验证 - 博客园 laravel在cli模式下输出格式漂亮一些 laravel计划任务和异步队列任务,拆分成不同队列,减少计划任务系统压力 debug redis里面的lua脚本 laravel chunkById导出数据乱序问题 PHP 真正异步编程即将到来 首个 alpha 版本已经发布 (转) 关于his esb企业服务总线系统设计 多渠道订单,对应渠道公司的提现主体,如何设计系统 sourcetree无法获取远程所有的tag 支付宝沙盒模式商家转账经常出现 响应异常: 解包错误 laravel 使用异步队列,context带的上下文造成反序列化出问题 hyperf 的默认创建项目部署k8s docker缺失文件 在laravel使用注解自动注册 hyperf 查看所有路由的命令 线上就医全流程医药机构接入文档接口代码-医保就医接口php-demo版本 windows lm studio 0.3.8无法下载模型,更换镜像
laravel 主表和从表一对一,从表是要多个选取最新的一条,性...
zh7314 · 2025-06-10 · via 博客园 - zh7314

2025年6月10日10:35:15

Driver 模型关联方法
    // 关联司机定位表
    public function driverLocation()
    {
        return $this->hasOne(\App\Models\DriverLocation::class, 'driver_id', 'id');
    }

// 关联方法

 $query = Driver::with([
            // 第一种常规写法
            'driverLocation' => function ($query) {
                $query->orderBy('id', 'desc');
            },
            // 第二种 减少结果集排序
            'driverLocation' => function ($query) {
                $query->orderBy('id', 'desc')->limit(1);
            },
            // 使用max子查询
            'driverLocation' => function ($query) {
                $query->whereIn('id', function ($sub) {
                    $sub->selectRaw('MAX(id)')
                        ->from('driver_locations')
                        ->groupBy('driver_id'); // 分组获取每组最大 id
                });
            }
        ]);
        
窗口函数 sql,其实性能也不好
SELECT *
FROM (
    SELECT *,
        ROW_NUMBER() OVER (
            PARTITION BY driver_id 
            ORDER BY 
                id DESC  -- 时间相同时取最大id(最新插入)
        ) AS rn
    FROM driver_location
) AS ranked
WHERE rn = 1;

Driver关联 driverLocation表,driverLocation是多条,关联的是最新的一条数据的需要,但是 driverLocation有几百万条数据,所以 按照平常的写法导致性能很差

第一种,是最常见的倒序排序,在关联最新的一条,但是结果集需要排序,如果 driverLocation的数据量很大,就会很慢

第二种,是第一种的优化结果,这样就不需要吧结果集在排序,但是mysql本身会使用 ->orderBy('id', 'desc') 排序性能一般,如果 driverLocation的数据量很大,性能就一般,适合关联数据集不多的,性能就没问题

第三种,直接通过MAX函数,获取最新一条

推荐方式,这种需要确定关联最新一条的数据,如果数据量不大,那么 $query->orderBy('id', 'desc')->limit(1); 这种是最好的
如果数据量大,需要关联最新的一条,不论什么方式,性能都不太好,建议在redis存一下,这样直接去redis里取值,性能是最好的
比如这里的场景,司机定位信息,一般需要比较及时的,一般缓存一下 司机id作为key,gps信息json,作为value,有效时间为1小时