半个PostgreSQL DBA,热衷于数据库相关的技术。我的ppt分享https://pan.baidu.com/s/1eRQsdAa https://github.com/chenhuajun https://chenhuajun.github.io
分类: 数据库开发技术
2014-02-14 12:12:22
偶然看了几篇关于数据库分页性能优化的文章。概括起来主要有以下几个策略。
1,缓存结果
缓存有资源消耗,命中率和数据一致性等问题,其利弊需要根据使用场景进行权衡。
2,利用索引迅速跳过offset之前的记录
对单个分页请求来说,一页的返回记录数通常很少,但要跳过的记录数可能会非常多。如何快速跳过这些offset之前的记录是优化的关键。可以用下面的办法:
i,对查询结果进行排序(比如:order by id)
ii,排序的列上有索引并且要让执行计划使用这个索引
iii,提供排序的列在该页中的值范围以便能让索引扫描快速定位(比如:id > 10000)
然而如和得到排序的列在该页中的值范围呢?两个办法,一是在上次查询时预先存下来,这样做性能最好,但应用程序必须要一起修改。二是可以用一个子查询单独获取,这个子查询由于只需要得到排序列的值而不是所有的细节,所以有可能找到比直接让主查询过滤效率更高的执行计划。
3,减少应用对大offset的分页需求
如果查询的总结果数非常大,用户不太可能特别关心很远的那些记录。所以不需要提供给用户直接跳转到任意页面的能力。比如可以像google那样,只提供前10页的链接,10页以外的页面需要用户挨个翻页。
参考:
http://blog.163.com/digoal@126/blog/static/163877040201411152640383/