分页优化方案

paging
分页是常见的需求,但是有可能成为性能的瓶颈

避免显示总页数

APP现在主流的设计都是瀑布流,不太会显示总页数了。但是有些web应用在分页时,还是会将总页数展示给用户

为了得到总页数,需要执行select count(1),如果无法命中索引的话,全表扫描的性能会非常差。一种可替代的方案,如果id是自增的,可以通过select max(id),近似地得到总页数,但是这种方法无法解决带where条件的查询

总的来说,分页时应尽量避免展示总页面,实际上这个需求对于用户并没有很大的价值

翻页的优化方案

常见的做法是order by xx limit 0, 10,然后order by xx limit 10000, 10

这样有2个问题,首先是翻页到后面性能会很差;另一个是如果有新数据插入,会导致同一条记录重复出现。

比较好的做法是每次查询把上一页的最后一条记录作为查询条件,始终查询第一页,如:

第一次,order by xx desc limit 0, 10

第二次,where xx < 9991 order by xx desc limit 0, 10

第三次,where xx < 9981 order by xx desc limit 0, 10