Sql查询优化方案

news/2025/10/20 17:37:25/文章来源:https://www.cnblogs.com/mjtabu/p/19153212

Mybatis 分页查询统计方法重写,在查询方法后面固定追加:"_COUNT"

比如:
分页查询方法:pageQuery
重写分页查询统计:pageQuery_COUNT
单表查询统计:select count(1) from xxxdb.t_order

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.mzph.cn/news/941426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机思维的数与位

计算机思维的数与位Posted on 2025-10-20 17:34 夜owl 阅读(0) 评论(0) 收藏 举报n进制的数与位 在计算机的代码世界中,是以二进制的位的基础来组成数,至此我还是混淆,二级制的1000(十进制的8)中的1是第4个数…

实用指南:深入解析HarmonyOS ArkTS:从语法特性到实战应用

实用指南:深入解析HarmonyOS ArkTS:从语法特性到实战应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

2025 防水背衬板厂家最新推荐榜:剖析质量与口碑,优选品牌助您精准采购

引言 在建筑防水工程愈发受重视的当下,防水背衬板的品质直接决定防水层的耐久性与建筑结构安全。但当前市场呈现 “劣币扰市” 乱象:部分企业用劣质原料生产的产品,短期内即出现渗漏、开裂问题,导致后期维护成本激…

如何安装fluentd 和fluentd-mongo的插件?然后收集nginx的 json格式的数据写到mongodb

手动安装 Fluentd + MongoDB 插件并收集 Nginx JSON 日志 以下是完整步骤,从安装 Fluentd 到配置 Nginx JSON 日志存储到 MongoDB。手动安装 Fluentd(td-agent)如果已通过 RPM 安装 td-agent,跳过此步。否则: 下载…

2025年气柱袋厂家推荐排行榜,防震/防摔/食品级气柱袋,奶瓶/奶粉/电子产品/化妆品气柱袋,缓冲包装与物流运输优选方案

2025年气柱袋厂家推荐排行榜:防震/防摔/食品级气柱袋,奶瓶/奶粉/电子产品/化妆品气柱袋,缓冲包装与物流运输优选方案 行业背景与发展趋势 随着电商物流行业的蓬勃发展,气柱袋作为现代包装领域的重要缓冲材料,正经…

详细介绍:EfficientNet:复合缩放

详细介绍:EfficientNet:复合缩放pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

2025 年防火涂料厂家最新推荐排行榜:精选优质企业,涵盖钢结构各类型涂料,助您精准选品

引言 在建筑与工业安全领域,防火涂料是抵御火灾、守护生命财产安全的关键防线。但当前市场乱象频发,部分企业生产的防火涂料未达国家标准,防火性能堪忧;品牌数量繁杂,产品质量差距悬殊,消费者和企业在选购时常常…

Docker 代理配置的迷思:为什么 127.0.0.1 不总是本地? - 若

在使用 Docker 时配置代理是一个常见的需求,但很多开发者都会遇到一个令人困惑的现象:明明代理服务运行在本机,使用 127.0.0.1 却无法正常工作。本文将深入探讨这个问题背后的原理。 问题现象 让我们先看两个相似的…

惠普打印机驱动下载与安装教程(图文详解 + 常见问题解决方案)

本文详细介绍了惠普打印机驱动的下载安装与配置教程,支持 Windows7/10/11 系统。通过官方安全下载渠道,提供全型号兼容驱动与图文安装步骤,并针对打印乱码、驱动不识别、扫描失败等常见问题提供解决方案。无论家用或…

PHP码农的微信业务开发利器

微擎系统:PHP码农的微信业务开发利器 作为一名深耕PHP开发的码农,我深知在微信生态中开发业务系统面临的挑战:接口对接繁琐、多平台适配复杂、功能迭代周期长。直到公司承接微信端业务需求时,我在网上偶然发现微擎…

深入解析:Matlab通过GUI实现点云的PCA配准(附最简版)

深入解析:Matlab通过GUI实现点云的PCA配准(附最简版)2025-10-20 17:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

词向量:从 One-Hot 到 BERT Embedding,NLP 文本表示的核心技术 - 实践

词向量:从 One-Hot 到 BERT Embedding,NLP 文本表示的核心技术 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

2025年深圳网站建设/外贸独立站推广/阿里巴巴代运营/1688店铺代运营/短视频运营推广/微信小程序开发服务商权威推荐榜

2025年深圳网站建设/外贸独立站推广/阿里巴巴代运营/1688店铺代运营/短视频运营推广/微信小程序开发服务商权威推荐榜 行业背景与发展趋势 随着数字化转型浪潮的深入推进,深圳作为中国科技创新中心,其数字营销服务行…

计算机毕业设计Hadoop+Spatk+Hive滴滴出行分析 出租车供需平衡优化系统 出租车分析预测 大资料毕业设计(源码+LW+PPT+讲解)

计算机毕业设计Hadoop+Spatk+Hive滴滴出行分析 出租车供需平衡优化系统 出租车分析预测 大资料毕业设计(源码+LW+PPT+讲解)2025-10-20 17:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !importan…

微信小脚本入门学习教程,从入门到精通,微信小程序开发进阶(7)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android studio build报错 - show

build报错> Task :app:checkDebugAarMetadata FAILED Execution failed for task :app:checkDebugAarMetadata. > Could not resolve all files for configuration :app:debugRuntimeClasspath.> Could not r…

2025 彩石瓦厂家最新推荐排行榜:权威解析金属瓦 / 屋顶瓦优质厂商,金属/屋顶/凉亭/昆明/云南彩石瓦厂家推荐

引言 随着绿色建筑理念深化与屋面材料升级,彩石瓦凭借耐候性强、装饰性佳的优势,成为别墅、文旅项目及新农村建设的核心选材。但市场现状令人担忧:既有产品基材厚度不达标、彩砂脱落等质量隐患,又存在新锐品牌与传…

2025 年最新干燥剂厂家推荐排行榜:深度剖析各品牌实力,涵盖氯化钙 / 氯化镁 / 硅胶等多类型干燥剂优选指南

在工业生产与日常生活中,干燥剂的防潮、保鲜作用愈发关键,小到食品药品储存,大到集装箱海运防潮,都离不开优质干燥剂的支撑。但当前干燥剂市场品牌繁杂,部分小品牌产品吸湿能力弱、持久度差,难以满足不同行业的专…

2025年螺杆泵厂家权威推荐榜:单干污泥料斗/浆料进料/高压耐磨/石油工业化工环保食品级船舶造纸加药计量/耐腐蚀高粘度污水污泥不锈钢铸铁304316全系解析

2025年螺杆泵厂家权威推荐榜:单干污泥料斗/浆料进料/高压耐磨/石油工业化工环保食品级船舶造纸加药计量/耐腐蚀高粘度污水污泥不锈钢铸铁304316全系解析 螺杆泵作为现代工业流程中不可或缺的核心设备,其技术水平和产…

2025 年工业 pH 计厂家最新推荐榜单:在线 / 污水 / 脱硫 / 发酵 / 化工等场景适用,国内优质厂家实力排行

引言 在工业生产与科研实验中,pH 计的精准度、稳定性直接关系到生产安全与实验结果可靠性。当前市场上 pH 计品牌杂乱,部分产品存在测量误差大、适配性差、售后缺失等问题,难以满足化工、环保、食品等多行业多样化需…