Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1929103
  • 博文数量: 193
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 3999
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-06 19:06
  • 认证徽章:
个人简介

半个PostgreSQL DBA,热衷于数据库相关的技术。我的ppt分享https://pan.baidu.com/s/1eRQsdAa https://github.com/chenhuajun https://chenhuajun.github.io

文章分类

全部博文(193)

文章存档

2018年(12)

2017年(23)

2016年(43)

2015年(51)

2014年(27)

2013年(21)

2011年(1)

2010年(4)

2009年(5)

2008年(6)

分类: 数据库开发技术

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/
http://www.orczhou.com/index.php/2009/03/four-way-pager-display/
http://www.111cn.net/database/mysql/51004.htm

 

阅读(3265) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册