news 2026/4/15 20:04:07

SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;的庖丁解牛

SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;高性能分页查询的典范,它通过游标分页(Cursor-based Pagination)避免了传统OFFSET的性能陷阱。


一、执行机制:为什么高效?

▶ 1.执行计划解析
EXPLAINSELECT*FROMordersWHEREid>1000000ORDERBYidLIMIT10;
  • 关键输出
    type: range key: PRIMARY rows: 10 Extra: Using where; Using index
▶ 2.执行流程

定位 id=1000000

通过聚簇索引向右扫描

读取下 10 行

返回结果

  • 核心优势
    • 仅扫描 10 行(而非OFFSET的 1,000,010 行)
    • 直接利用聚簇索引(InnoDB 主键即数据存储顺序)

💡核心认知
WHERE id > N+ORDER BY id= 直接跳转到 N+1 位置


二、索引利用:聚簇索引的威力

▶ 1.InnoDB 聚簇索引结构
  • 数据存储
    • 主键索引的叶子节点 = 完整行数据
    • 物理存储按主键顺序排列
  • 查询优势
    • WHERE id > N→ 直接定位到 B+ 树的 N+1 位置
    • 顺序读取后续 10 行 →无随机 I/O
▶ 2.对比非聚簇索引
  • MyISAM 表
    • 主键索引 ≠ 数据存储顺序
    • 需额外回表 → 性能下降
  • InnoDB 非主键查询
    • id非主键 → 需回表 → 性能下降

📌关键点
此查询高效的前提是id为 InnoDB 聚簇索引(通常是自增主键)


三、工程价值:游标分页的实践

▶ 1.前端交互设计
  • 传递游标
    • 前端保存上一页最后一条的id
    • 下一页请求携带cursor=id
  • 示例 API
    GET /orders?cursor=1000000&limit=10
▶ 2.后端实现
// Laravel 示例publicfunctionindex(Request$request){$cursor=$request->input('cursor',0);$limit=min($request->input('limit',10),100);$orders=Order::where('id','>',$cursor)->orderBy('id')->limit($limit)->get();returnresponse()->json(['data'=>$orders,'next_cursor'=>$orders->last()?->id]);}
▶ 3.性能对比
查询方式扫描行数响应时间(1亿行表)
LIMIT 1000000, 101,000,01012.3 秒
游标分页100.008 秒

四、避坑指南

陷阱破局方案
id 非自增主键确保排序字段是聚簇索引
并发插入导致漏数据接受最终一致性(业务可容忍)
反向分页困难单独实现WHERE id < cursor ORDER BY id DESC

五、终极心法

**“游标不是技巧,
而是索引的舞蹈——

  • 当你利用聚簇
    你在消除随机;
  • 当你传递锚点
    你在跳过扫描;
  • 当你接受最终一致
    你在拥抱现实。

真正的分页优化,
始于对存储的敬畏,
成于对细节的精控。”


结语

从今天起:

  1. 深度分页必用游标方案
  2. 确保排序字段是聚簇索引
  3. EXPLAIN验证执行计划(type=range)

因为最好的分页,
不是跳过百万行,
而是精准定位下一程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 11:59:46

零基础入门 Spring Boot:从‘Hello World’到可上线的 Web 应用

零基础入门 Spring Boot&#xff1a;从‘Hello World’到可上线的 Web 应用 &#x1f4a1; 适合谁&#xff1f; 完全没写过 Java Web 的新手&#xff0c;会安装软件、能看懂基础代码&#xff08;如 System.out.println&#xff09;&#xff0c;想快速上手一个真实可用的后端框架…

作者头像 李华
网站建设 2026/4/13 13:26:17

2026年小众但好用的免费开源项目管理软件Top10深度推荐

在当今快速发展的数字时代&#xff0c;项目管理软件成为了各类企业和团队不可或缺的工具。随着对高效、灵活且成本可控的需求增加&#xff0c;越来越多的小众开源项目管理软件进入市场&#xff0c;提供了多样化的选择。本篇文章将为您推荐2026年值得关注的十大免费开源项目管理…

作者头像 李华
网站建设 2026/4/14 10:17:22

Java基于Spring Boot+Vue的在线教育与资源管理系统

项目说明 随着互联网技术的迅猛发展和普及&#xff0c;教育领域正经历着前所未有的变革。传统的教育模式已经无法满足现代社会的多元化需求&#xff0c;特别是在信息爆炸的时代背景下&#xff0c;人们更加追求高效、便捷、个性化的学习方式。互联网技术的广泛应用不仅改变了人…

作者头像 李华
网站建设 2026/4/14 13:32:47

无法读取U盘,OTA升级U盘文件 返回-9

1.无法读取U盘&#xff0c; v_sys/system/sepolicy/private/system_app.te allow system_app mnt_media_rw_file:dir { search getattr open read }; allow system_app mnt_media_rw_file:file { getattr open read map }; 2.无法OTA升级U盘文件的修改&#xff01; v_sys/sy…

作者头像 李华