讨论:千万级的数据库分页算法

yubing8 2003-09-19 06:33:47
在网上看了很多很多的分页算法,一般的算法几万条的时候速度相当的不错,可当记录增加到百万级的时候,速度就慢了很多,现在想和大家讨论一下千万级的数据库分页算法,请大家仅管提出自已的看法
...全文
621 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
seaman0916 2003-10-09
  • 打赏
  • 举报
回复
http://www.hnitline.com/bbs/dispbbs.asp?boardID=18&ID=807

目前最好的分页技术

思想确实很好,看看就知道了!
Rabbit8 2003-09-28
  • 打赏
  • 举报
回复
强烈关注!
yubing8 2003-09-27
  • 打赏
  • 举报
回复
lifejoy(山外青衫):分析的非常好啊,我很同意你的观点,但是还想讨论一下技术
loverface 2003-09-26
  • 打赏
  • 举报
回复
学习
lifejoy 2003-09-26
  • 打赏
  • 举报
回复
千万级的数据库,有分页的意义吗?对于用户来说就是信息的海洋了,去看看Google怎么做的吧,
根本就不存在如何分页的问题,如果一个结果有千万条,那跟没有结果一样是没有一样.应该是统计条数,取出,前N条进行分页,如果到地还在准备分页的话,再次取结果n,进行分页.并且在其间推荐用户进行递进式搜索,来降低信息量,才式正确的.
blue999star 2003-09-26
  • 打赏
  • 举报
回复
mark
whales 2003-09-26
  • 打赏
  • 举报
回复
前面的大部分例子只适用于简单的的查询,对于多表的的不定条件的查询很麻烦
vcvj 2003-09-26
  • 打赏
  • 举报
回复
gz
BluePenguin 2003-09-26
  • 打赏
  • 举报
回复
在查询分页代码中使用Hibernate的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。
BluePenguin 2003-09-26
  • 打赏
  • 举报
回复
Hibernate是个非常好用的O/R开源项目:http://hibernate.bluemars.net/

最近刚有了中文论坛:http://hibernate.fankai.com/

最新消息,Hibernate已经归入JBOSS计划,但仍然自成一个子项目,不会影响单独使用。
zengchangliu 2003-09-26
  • 打赏
  • 举报
回复
我有一个方法:(对于喜欢用select * 的同行可能有用)
先检索出来,符合条件的所有 id (唯一标识)放在内存里
然后根据当前页数和每页多少行纪录 去内存中取 id号的当前集
根据当前集 中的某一条 去数据库中检索相应的数据行
这里建议使用编译预处理PrepareStatement
将结果放进数据类 (如果你的数据只有两列当然可以省略这一步)
然后把数据类添加进 ArrayList 或者HashMap
然后 把载页面上输出 ArrayList 或者HashMap 的数据
这样做,是因为只检索一列数据 要比检索多类要快得多 占用更少的内存。
一次只精确定位一条纪录 要比一次取出多条要快,这里的瓶颈在于频繁的与数据库交互,但是我们使用编译预处理可以很大程度上提高性能。
yubing8 2003-09-25
  • 打赏
  • 举报
回复
BluePenguin():你指的Hibernate是什么?可否详细说一下
yubing8 2003-09-25
  • 打赏
  • 举报
回复
ejbcreate():目前我用的是sql server 有没有好解吗?
ejbcreate 2003-09-22
  • 打赏
  • 举报
回复
写错了,应该是:
我就选第21条到40条记录,如此类推。
...
ejbcreate 2003-09-22
  • 打赏
  • 举报
回复
我介绍一种不错的分页方法吧:
如果你的页面要显示20条记录,我就只是选第1条到第20条记录,然后你按‘下一页’时,我就选第21条到30条记录,如此类推。

大概的实现方法如下(数据库为:oralce):

不要一下子把所有符合条件的记录选出来,我的意思是说:你从jsp里传几个参数,
<a href="a.jsp?NextPage=2&RowsPage=10">下一页</a>
//其中NextPage:下一页的页码;RowsPage:每页显示的记录数;
1) 这样你可以先计算出符合条件的记录数目:
String lCountSql = "select count(*) as rowcount from ("+sSql+")";
rs = st.executeQuery(lCountSql);
int iCounts = 0;
if(rs.next())
iCounts = rs.getInt("rowcount");

2)获得你传过来的参数,并做处理:
int nRowPage = request.getParameter("RowsPage")==null?0:Integer.parseInt(request.getParameter("RowsPage"));
int nPage = request.getParameter("NextPage")==null?0:Integer.parseInt(request.getParameter("NextPage"));
if(nRowPage<1) nRowPage=10;
int nPages = (iCount-1)/nRowPage+1;
if (nPages<1) nPages=1;
if (nPage>nPages) nPage=nPages;
if (nPage<1) nPage=1;

3)进一步处理,
int nStartRow = 0;
int nEndRow = nRowPage;
if(nPage>1){
nStartRow = (nPage-1)*nRowPage+1;
nEndRow = nPage*nRowPage;
}
String sSql_1 = "select a.* from (select b.*,rownum rn from("+sSql+") b where rownum <= "+nEndRow+") a where rn >= "+nStartRow;
4)取得你想要的数据:
rs = st.executeQuery(sSql_1);
while(rs.next())
{
//
}

PS:你原来的SQL语句得按一定顺序排序,所选的数据才会正确,而且要oracle9i及以上版本才支持(select b.*,rownum rn from("+sSql+") 中sSql里有order by 语句的。
BluePenguin 2003-09-22
  • 打赏
  • 举报
回复
建议你直接使用Hibernate,里面有直接分页的函数,而且是针对不同数据库做了速度优化的,非常爽!例如ORCAL采用的SQL语句与SQL SERVER的语句是不同的。
wsyab 2003-09-22
  • 打赏
  • 举报
回复
starfeng(feng) && rootwuyu(wuyu)

我不太明白你们说得意思,例如:

表test,字段id排倒序,怎么写??
不会是取出来成另个临时字段,两个select吧
yubing8 2003-09-22
  • 打赏
  • 举报
回复
大家也讨论一下sql server啊,我现在用的是sql server数据库
jindunfu 2003-09-22
  • 打赏
  • 举报
回复
UP rootwuyu(wuyu)的敬业精神
rootwuyu 2003-09-22
  • 打赏
  • 举报
回复
“你用sql嵌套就是了,先查了limit的,再order by”

应该是先order by了再limit吧?
加载更多回复(30)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧