【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 次,而不是在分页过程中回表
相关推荐
海兰6 分钟前
【高速缓存】RedisVL 高级查询(全文搜索、混合搜索和 多向量搜索)
数据库·人工智能·redis·缓存
DBA_G12 分钟前
GBase 8s数据库大对象存储详解
数据库
sbjdhjd25 分钟前
SQL 注入零基础详解:原理、手工注入流程与 Sqli-Labs 靶场实战1~5关和第9关思路
数据库·sql·计算机网络·web安全·网络安全·网络攻击模型·安全架构
Tencent_TCB2 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
网络·数据库·腾讯云
数智化管理手记2 小时前
预算控制手工核对效率低?预算控制数字化落地实操如何做?
大数据·网络·数据库·人工智能·数据挖掘
MXsoft6182 小时前
成熟的自动化运维平台是什么样的?
运维·数据库·自动化
吴声子夜歌2 小时前
MongoDB 4.x——合理使用索引(二)
数据库·mongodb
慾玄2 小时前
sql注入靶场1-5,9关
数据库·sql
洞见前行2 小时前
Android 渲染优化实战:从看懂 Overdraw 到用 ConstraintLayout 一套布局适配所有屏幕
性能优化