You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将普通SELECT查询转换为带JOIN的SELECT查询以优化性能?

转换后的高性能JOIN版本查询

没问题,我帮你把原查询转换成适配OFFSET/LIMIT场景的高性能JOIN写法,完全贴合你的业务需求:

$stmt->prepare("
    SELECT b.* 
    FROM (
        -- 先通过子查询精准获取需要的id(仅处理索引字段,速度快)
        SELECT id 
        FROM books 
        WHERE person_id = :person_id 
        ORDER BY id DESC 
        LIMIT 5, 10
    ) o 
    -- 再关联原表获取完整数据
    JOIN books b ON b.id = o.id 
    ORDER BY b.id DESC
");

为什么这么改?

  • 原查询中如果books表数据量很大,OFFSET 5会让数据库先扫描符合条件的前5+10条数据,再跳过前5条返回结果,浪费资源。
  • 优化后的写法让子查询只处理id字段:如果你给books表建一个(person_id, id DESC)的联合索引,这个子查询可以直接通过索引拿到目标id,完全不需要回表扫描数据,速度会快很多。
  • 最后通过JOIN获取完整字段,既保证了性能,又保留了你原查询需要的所有数据。

额外优化建议

如果还没建索引,建议执行这条语句创建联合索引,进一步拉满性能:

CREATE INDEX idx_books_person_id_id ON books(person_id, id DESC);

内容的提问来源于stack exchange,提问作者baileyJchoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:11:22