【MySQL-索引调优】10:常见的分页优化处理

1-游标/书签分页

sql 复制代码
-- 首次查询
SELECT * FROM orders ORDER BY create_time LIMIT 10;
-- 记录最后一条的 create_time = '2024-01-15 10:30:00'

-- 下一页(瞬间定位,与页码无关)
SELECT * FROM orders 
WHERE create_time > '2024-01-15 10:30:00' 
ORDER BY create_time LIMIT 10;

与传统分页的区别:

传统分页 游标分页
LIMIT offset, size WHERE 游标字段 > 上次值 LIMIT size
依赖偏移量(第几页) 依赖锚点(从哪条开始)
页码越深越慢 性能恒定,与深度无关

适用场景:

场景 方案 原因
常规后台(< 1000 页) LIMIT offset, size + 索引 需要支持跳页,数据量可控
大数据后台(> 10w 页) 强制筛选条件 + 限制页码 避免深分页性能灾难
实时性要求低(如报表) 游标分页 + 异步导出 全量导出场景

具体使用:

sql 复制代码
-- 复合索引
INDEX idx_create_time_id (create_time, id)  
-- 首次查询(无游标)
SELECT * FROM orders 
ORDER BY create_time, id 
LIMIT 10;

-- 返回最后一条:create_time='2024-01-15 10:30:00', id=12345

-- 下一页(有游标)
SELECT * FROM orders 
#当 create_time 可能重复时,必须加唯一字段(如 id)确保稳定排序
WHERE (create_time > '2024-01-15 10:30:00') 
   OR (create_time = '2024-01-15 10:30:00' AND id > 12345)
ORDER BY create_time, id 
LIMIT 10;

游标的优势在于深分页时保持恒定性能

2-覆盖索引

索引中已经包含查询所需的全部字段,查询可以直接从索引返回结果,不需要回表

3-延迟关联

先用索引快速定位需要的主键,再用这些主键去表里取完整数据

sql 复制代码
# create_time索引
INDEX idx_create_time (create_time)
# 第一步:只在索引上分页,拿到主键集合
SELECT id
FROM orders
ORDER BY create_time
LIMIT 10000,10;
# 第二步:用这些主键去表里取完整行
SELECT *
FROM orders
WHERE id IN ( ...10个id... )
ORDER BY create_time;
# 只回表 10 次,而不是在分页过程中回表
相关推荐
小陈工28 分钟前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull5 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花5 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸5 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java6 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿6 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb