当前位置: 首页 > news >正文

Sql查询优化方案

sql 查询优化

利用LIMIT语法确认偏移量,缩小数据范围,随后依据ID查询主表。

  • 结合前端分页传参动态计算数据的偏移量
  • 条件筛选字段仅为id,并根据id字段升序排列
  • 以查询结果的id为结果集 inner join 全表字段
SELECT t.* FROM (SELECT id FROM xxxdb.t_order ORDER BY id LIMIT 1000000, 10) tmp
inner join xxxdb.t_order t ON t.id = tmp.id

limit value 计算逻辑

LIMIT offset, rows 
offset = limit的偏移量 = (pageNumber-1) *pageSize = 1000000
rows = limit的限定行 = pageSize = 10

Deepseek 对比以下sql的性能

sql1:
SELECT t.* FROM (SELECT id FROM xxxdb.t_order ORDER BY id LIMIT 1000000, 10) tmp
inner join xxxdb.t_order t ON t.id = tmp.idsql2:
SELECT * FROM xxxdb.t_order t
ORDER BY t.id 
LIMIT 1000000, 10

结论先行:在绝大多数情况下,SQL1 的性能远优于 SQL2。

下面是详细的分析和原因解释。

核心区别

两条 SQL 的目标完全相同:获取 xxxdb.t_order 表中第 1000000 行开始的 10 条记录,并按 id 主键排序。

它们的根本区别在于 执行路径 不同。


SQL2 分析:SELECT * ... LIMIT 1000000, 10

SELECT * FROM xxxdb.t_order t
ORDER BY t.id 
LIMIT 1000000, 10
  1. 执行过程

    • 首先,服务器需要构建一个完整的结果集。它会读取所有满足条件的行(这里是整个表),并按照 ORDER BY t.id 进行排序。
    • 由于 id 是主键,并且 ORDER BY 与主键一致,理论上可以利用主键索引来避免一次全表排序。这是一个优化点。
    • 但是,LIMIT 1000000, 10 意味着 MySQL 必须顺序扫描直到找到第 1000000 条记录。它会从第 1 条开始,一条一条地数,数过 1000000 条之后,再返回接下来的 10 条。
    • 在这个过程中,它需要读取这 1000010 条记录的完整行数据(因为你是 SELECT *),这包括所有列,可能包含 TEXT, BLOB 等大字段。
  2. 性能瓶颈

    • 巨大的 I/O 开销:即使只需要 10 条数据,数据库也需要从存储中读取超过 100 万条完整的数据行。如果表很宽(列很多),这个 I/O 量会非常惊人。
    • 巨大的网络和内存开销:虽然最终只返回10行,但服务器内部需要准备超过100万行的数据,这会消耗大量内存和CPU资源进行数据的临时存储和排序(如果无法走索引排序的话)。

SQL1 分析:先查ID,再回表

SELECT t.* FROM (SELECT id FROM xxxdb.t_order ORDER BY id LIMIT 1000000, 10) tmp
inner join xxxdb.t_order t ON t.id = tmp.id
  1. 执行过程(分两步)

    • 第1步 - 子查询SELECT id FROM ... LIMIT 1000000, 10
      • 这个子查询只查询 id 这一列。由于 id 是主键,这个查询可以完全通过遍历主键索引(聚簇索引的叶子节点)来完成
      • 主键索引的叶子节点只包含 id 值本身(以及指向实际数据的指针)。这意味着:
        • 需要读取的数据量远小于SQL2。索引文件通常比数据文件小得多。
        • 同样的,它也需要扫描索引中的 1000010 个条目,但因为它只读取 id 这一个轻量级的字段,速度会快几个数量级。
    • 第2步 - 回表查询INNER JOIN ... ON t.id = tmp.id
      • 子查询得到10个目标 id 后,再用这10个 id 去主表(聚簇索引)里精确查找对应的10条完整记录
      • 这个过程称为 "回表"(Bookmark Lookup)。由于是通过主键 id 等值连接,这10次查询是非常快速的。
  2. 性能优势

    • 极致的 I/O 优化:将一次需要读取 100 万条宽记录的沉重操作,拆解成了:
      1. 一次读取 100 万个轻量级索引键的操作。
      2. 十次通过主键精确查找的极速操作。
    • 第一步虽然扫描量大,但数据密度高,速度快。第二步是点查,效率极高。总体耗时远低于SQL2的单次沉重扫描。

对比表格

特性 SQL2 (直接LIMIT) SQL1 (子查询+回表) 胜出方
数据扫描量 扫描 1000010 条完整记录 扫描 1000010 个索引键 + 10 条完整记录 SQL1
I/O 压力 非常大(涉及所有列) 较小(主要操作在紧凑的索引上) SQL1
执行速度 慢,随 Offset 值线性增长 快,虽然也受 Offset 影响,但基数小得多 SQL1
网络/内存开销 高(在服务器端准备大量数据) 低(服务器端只处理ID和最终10条数据) SQL1
代码可读性 ,简洁明了 较低,需要理解其优化意图 SQL2

总结与建议

  • 对于大偏移量的分页查询,SQL1 是标准的性能优化写法。 它通过利用覆盖索引(在这个案例中就是主键索引本身)的优势,最大限度地减少了数据访问量,从而大幅提升性能。
  • SQL2 在偏移量很小(比如 LIMIT 0, 10)时,性能可能与 SQL1 相差无几,甚至因为减少了一次关联而略快。 但随着 OFFSET(本例中的 1000000)的增大,SQL2 的性能会急剧下降,而 SQL1 的性能下降曲线则平缓得多。

最佳实践:
对于这种深度分页问题,除了使用 SQL1 的优化模式,还可以考虑以下更进一步的优化:

  • 游标分页(Cursor-based Pagination):不使用 LIMIT offset, number,而是记录上一页最后一条记录的 id,然后查询 WHERE id > last_id LIMIT 10。这种方式可以做到常数时间的查询速度,但牺牲了直接跳到任意页的能力。这在移动端App和现代Web应用中非常流行。
http://www.hskmm.com/?act=detail&tid=35156

相关文章:

  • 实用指南:深入解析HarmonyOS ArkTS:从语法特性到实战应用
  • 2025 防水背衬板厂家最新推荐榜:剖析质量与口碑,优选品牌助您精准采购
  • 如何安装fluentd 和fluentd-mongo的插件?然后收集nginx的 json格式的数据写到mongodb
  • 2025年气柱袋厂家推荐排行榜,防震/防摔/食品级气柱袋,奶瓶/奶粉/电子产品/化妆品气柱袋,缓冲包装与物流运输优选方案
  • 2025 年防火涂料厂家最新推荐排行榜:精选优质企业,涵盖钢结构各类型涂料,助您精准选品
  • PHP码农的微信业务开发利器
  • 词向量:从 One-Hot 到 BERT Embedding,NLP 文本表示的核心技术 - 实践
  • 2025年深圳网站建设/外贸独立站推广/阿里巴巴代运营/1688店铺代运营/短视频运营推广/微信小程序开发服务商权威推荐榜
  • Android studio build报错 - show
  • 2025 年蜂窝大板厂家最新推荐榜单:覆盖云南 / 昆明吊顶、铝门、别墅等场景,优质企业助力选对产品
  • 生产环境RAG系统失效原因与解决方案
  • 2025 彩石瓦厂家最新推荐排行榜:权威解析金属瓦 / 屋顶瓦优质厂商,金属/屋顶/凉亭/昆明/云南彩石瓦厂家推荐
  • 文明元代码:价值原语、共识具身与关系语法
  • 2025年扒胎机厂家推荐排行榜,液压无损扒胎机,全自动扒胎机,汽保扒胎机,轮胎扒胎机,汽车扒胎机,大轮胎扒胎机,无损扒胎机,辽南扒胎机,小车扒胎机,立式扒胎机公司推荐
  • springboot集成echarts显示图表
  • 2025年储罐厂家权威推荐榜:钢衬塑储罐/钢塑复合储罐/化工储罐/防腐储罐/PE储罐/盐酸储罐/硫酸储罐/聚丙烯储罐/不锈钢储罐/次氯酸钠储罐专业选购指南
  • Avalonia使用代码更改滑动条的颜色
  • 【SPIE出版】第四届云计算、性能计算与深度学习国际学术会议 (CCPCDL 2025)
  • 【IC原厂】VKD104CB 内建稳压电路低电流4路触摸检测IC
  • 2025年氧化镁厂家最新权威推荐榜:活性氧化镁,肥料级氧化镁,高纯度氧化镁源头厂家深度解析及选购指南
  • 上班摸鱼新姿势!抖音爆火的线稿涂鸦也太治愈了~
  • n8n错误处理全攻略:构建稳定可靠的自动化工作流
  • 2025年通风天窗厂家最新权威推荐榜:通风天窗,排烟天窗,通风气楼,屋顶通风器,顺坡气楼,10A通风天窗,1型通风天窗,TC5A通风天窗,TC12B通风天窗,屋脊通风天窗专业制造与高效通风解决方案
  • DAO模式代码阅读及应用
  • 2025年智能照明系统/模块厂家推荐排行榜,工厂/车间/改建/高亮/高光效/泛光/免维护/投光/大功率智能照明系统及模块公司精选
  • DxO Nik Collection 8.0:7 款专业摄影插件套装,一站式图像后期解决方案
  • [随笔11] 最近的心情 - 枝-致
  • 三款AI平台部署实战体验:Dify、扣子与BuildingAI深度对比
  • #OO之接口-DAO模式代码阅读及应用
  • PPO GRPO GSPO DAPO的Loss计算与代码实现