前言
突破查询瓶颈的方法有很多,但这里先不谈分库分表之流,当头问题就一个:单数据表分页查询过慢怎么办?
其实讲分页优化的博客真不少,但很多博主只顾分享点子忽略了细节,还有很多值得补充的地方。笔者回顾了曾经在千万级 BBS 项目的优化经历,尽可能结合实际地聊聊个人对分页查询的见解。也希望读者在亲身操作中验证,任何优化脱离了实际场景都是纸上谈兵。
分页方式
首先介绍最常见的数据分页方式,即传统分页和流式分页。
传统分页
传统分页的基本逻辑是每页展示固定的条目数、通过页码分页和翻页,包含要素如下:
首页:按序查询出一页长度的数据,作为顶部数据,无须处理偏移量。
下一页:除了末页都有下一页。通过页数能确定当前数据的偏移量,和数据总数比较可以判断是否还有下一页。偏移量可用于获取下一页的信息。
上一页:除了首页都有上一页。其余同上。
跳转:同上,偏移量来判断是否支持跳转到该页。
总页数:只要记住数据总量,除一下就能得到页数。结合跳转功能使用。
末页:许多系统会支持跳转到最后一页,根据总页数或总量即可实现。
翻页和跳转功能为查询效率带来了极大挑战,一方面带着偏移量的 MySQL 查询效率不高,另一方面功能上也存在缺陷