【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 次,而不是在分页过程中回表
相关推荐
吠品2 分钟前
.NET 8 单文件发布:把 exe 和一堆 dll 打进一个文件里
服务器·数据库·windows
cmes_love14 分钟前
期货五档tick数据下载教程期权五档高频历史数据以及分钟量化回测下载
数据库
蚂蚁数据AntData17 分钟前
从ChatBI到业务记忆:重新定义数据智能的生产力边界
大数据·网络·数据库·人工智能·算法
cfm_291419 分钟前
JVM垃圾收集算法与收集器深度解析
jvm·测试工具·算法·性能优化
Quincy_Freak21 分钟前
技术随笔|银河麒麟aarch64内网轻量数据分析工具 SQLiteGo 使用体验
大数据·数据库·数据挖掘·数据分析·sqlite·银河麒麟·aarch64
Amnesia0_021 分钟前
MySQL视图和用户管理
数据库·mysql
matrixmind132 分钟前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
数据库小学妹33 分钟前
时序数据怎么存?InfluxDB、TDengine、TimescaleDB与国产融合方案选型实战
大数据·数据库·经验分享·时序数据库·dba
芒鸽38 分钟前
HarmonyOS 数据持久化开发实战:KVStore、关系型数据库与 Preferences
数据库·华为·harmonyos
kisdiem1 小时前
让大模型从“会回答”走向真正调用业务系统
数据库