分页查询OFFSET 与 SIZESELECT * FROM table LIMIT {#offset}, {#size};size 每页显示多少条一页拿几条offset 要跳过多少条从第几行开始拿公式offset (page - 1) * size数据库做的事情是不去读取 10000 条数据直接定位到第 offset 条开始只取紧接着后 10 条只把这 10 条返回给后端应用环境后台管理系统、表格页深度分页OFFSET再大数据库也必须从第 1 行开始一行行数到OFFSET的位置因为数据是存在磁盘上的它没有 “直接定位到第 N 行” 的功能必须从头遍历计数。前面数据白白扫描并丢弃于是OFFSET 越大查询越慢。深度分页问题当使用LIMIT offset, size且offset值很大时数据库需要扫描offset size条记录后丢弃前面的offset条性能急剧下降。一句话总结深度分页的本质是OFFSET导致的全表扫描优化核心是利用 索引 直接定位起始点避免扫描后丢弃。解决方法有哪些呢·ID 游标分页SELECT * FROM table WHERE id #{lastId} -- 上一页最后一条数据的ID ORDER BY id ASC LIMIT #{size}SELECT * FROM table WHERE id #{firstId} -- 本页第一条ID ORDER BY id DESC LIMIT #{size}优点无论翻到第几页速度完全一样百万、千万、亿级数据都不卡数据库利用主键索引瞬间定位不会因为页数大而变慢适合滚动加载上拉加载更多缺点不能跳页不能直接跳到第 100 页只能 上一页 / 下一页必须有序、唯一的 ID主键不能随便排序必须按 ID 或唯一索引排序应用环境移动端、滚动加载、大数据量
数据库应用
发布时间:2026/6/1 2:11:12
分页查询OFFSET 与 SIZESELECT * FROM table LIMIT {#offset}, {#size};size 每页显示多少条一页拿几条offset 要跳过多少条从第几行开始拿公式offset (page - 1) * size数据库做的事情是不去读取 10000 条数据直接定位到第 offset 条开始只取紧接着后 10 条只把这 10 条返回给后端应用环境后台管理系统、表格页深度分页OFFSET再大数据库也必须从第 1 行开始一行行数到OFFSET的位置因为数据是存在磁盘上的它没有 “直接定位到第 N 行” 的功能必须从头遍历计数。前面数据白白扫描并丢弃于是OFFSET 越大查询越慢。深度分页问题当使用LIMIT offset, size且offset值很大时数据库需要扫描offset size条记录后丢弃前面的offset条性能急剧下降。一句话总结深度分页的本质是OFFSET导致的全表扫描优化核心是利用 索引 直接定位起始点避免扫描后丢弃。解决方法有哪些呢·ID 游标分页SELECT * FROM table WHERE id #{lastId} -- 上一页最后一条数据的ID ORDER BY id ASC LIMIT #{size}SELECT * FROM table WHERE id #{firstId} -- 本页第一条ID ORDER BY id DESC LIMIT #{size}优点无论翻到第几页速度完全一样百万、千万、亿级数据都不卡数据库利用主键索引瞬间定位不会因为页数大而变慢适合滚动加载上拉加载更多缺点不能跳页不能直接跳到第 100 页只能 上一页 / 下一页必须有序、唯一的 ID主键不能随便排序必须按 ID 或唯一索引排序应用环境移动端、滚动加载、大数据量