服务热线:18243769982

ASP+ACCESS千万亿万级数据库秒翻页设计方案

网站首页 > 文章中心 > 58天建站教程 > ASP相关浏览:29

传统的翻页方法在数量达到10万记录集的时候,基本上就会遇到翻页瓶颈,即便使用select top方法也不能满足,如:

PageSize=20   ’--每页现实记录数

pn=request("pn")  ’--获取第多少页

TitleSearchWord=request("TitleSearchWord")

TotWhere=" where 1=1"  ’--为了附加更多查询条件

if TitleSearchWord<>"" then TotWhere=TotWhere&" and title=’123123’"  ’--用于获取更多查询条件

SQLwhere=" where id<(SELECT Min(id) FROM (SELECT TOP "&PageSize*(pn-1)&" id FROM 表名称 "&TotWhere&" ORDER BY id desc) AS T ) "

set rs=server.createobject("adodb.recordset")

rs.open "SELECT top "&PageSize&" id  from 表名称 "&SQLwhere&" order by id desc ",conn,1,1

rs.close

set rs=nothing

这种方法在10万数据量的时候依然会开始性能下降。主要因为order by id desc进行ID倒序排列的关系。如果去掉倒序排列依然是秒分页,如何解决ID倒序排列并可以在千万级的时候也能达到秒分页呢?


解决方案如下:

首先我们要以最快的方式获取记录集ID列的最大数值,方法:

set rs=server.createobject("adodb.recordset")

rs.open "select max(id) from 表名称",conn,0,1

maxid=rs(0) ’--获取ID列的最大ID值,如:maxid=100

rs.close

set rs=nothing

接下来,设定ID的读取范围

if pn>1 then ’--当前页不是第一页的时候,如第2页的时候

maxid=maxid-PageSize*(pn-1) ’--获取选定区域的最大ID值,如第2页,应抽取第61到80条记录maxid=100-20*(2-1)=80

minid=maxid-PageSize+1 ’--获取选定区域的最小ID值,如第2页,minid=80-20+1=61

else

minid=maxid-PageSize+1 ’--当前页为第一页的时候,最小ID取值,minid=100-20+1=81

end if

最后,调用记录集

rs.open "SELECT id from 表名称 "&SQLwhere&" and id>="&minid&" and id<="&maxid&" order by id desc ",conn,1,1

这个时候,我们无需采用TOP方式,因为选定的ID已经设定在20个数据之内,直接抽取的就是这20条数据,然后进行的order by id desc也是在这20条内进行倒序排列,实现了ID倒叙排列也能秒翻页的方法。

要注意的是,这种方法可以应付数据量达到亿级的数据库,但是ID不能有中断或删除,如1-100条记录,比如其中第60条到第80条如果删除了的话,那么在翻页期间,如果翻到第2页会出现显示不出数据的问题。

另外,这种方法不能有额外的读取条件,如:

rs.open "SELECT id from 表名称 "&SQLwhere&" and id>="&minid&" and id<="&maxid&" and title=’123123’ order by id desc ",conn,1,1

有多余条件的话,记录在页面将不会显示出来。因为第81到第100条记录并不存在title为123123的数据。很可能会在第1-50条之间出现title为123123的数据,所以如果有附加条件,那么依然要采用传统的方法。如:

rs.open "SELECT top 20 id  from 表名称 where title=’123123’ order by id desc ",conn,1,1

附加一种如果数据中间有部分删除,获取所有记录总数的方法:

SQLrc="Select count(id) As RecordSum From 表名称" 

Set Rs=conn.Execute(SQLrc,0,1) 

TotalRecords=int(Rs(0)) ’--获取记录总数

Rs.Close

Set Rs=Nothing