如何将普通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
相关产品推荐
相关产品推荐

