传统的翻页方法在数量达到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