数据库避免n+1,但是怎么分页

数据库避免n+1,但是怎么分页,第1张

据库查询不能只考虑数据库的负载,还要考虑网络和应用的负载,tcp连接是很昂贵的,即使有了连接池,大量的使用N+1查询也是不明智的。至于第二个问题,当查询条件不一样时命中率会有多高?如果N比较大(比如100)假设你的命中率是80%,这已经很高了,那么你每次请求都会需要20次数据库查询,到最后可能需要将几乎整个数据库都缓存在内存中才能抵消n次查询带来的性能损失。

如果只是想在电脑上查看,解决方法:视图——分页预览

如果要打印,每页都有红色那一行的标题,解决方法:文件——页面设置——工作表——打印标题-顶端标题行——右边红色按钮——选中你截图的红色那一行——确定。 这样打印的时候,每页最上面一行都是你选中的那一行内容

不想看这个代码,给你我写的

ASP部分直接放到OPEN下面,修改rspagesize和shownum,把6asp修改成你的显示页,就什么都不用管了,你先看看效果:

<< < 1 2 3 4 5 > >>,当前页次数字为红色,也提供文本框,输入数字直接跳转到具体页

<style type="text/css">

<!--

A:link {COLOR: #000000; TEXT-DECORATION: none}

A:visited {COLOR: #000000; TEXT-DECORATION: none}

A:active {COLOR: #000000; TEXT-DECORATION: underline}

A:hover {COLOR: #000000; TEXT-DECORATION: underline}

Aa01:link {text-decoration:none;color:#FF0000;}

Aa01:visited {color:#FF6600;}

Aa01:active {color:#FF6600;font-weight: normal;}

Aa01:hover {color:#FF6600;text-decoration: none;}

-->

</style>

<%

rspagesize=2

shownum=3 '每页数字分页显示分页序号的数目

rct=shownumrspagesize

if requestquerystring("wpage")<>"" and isnumeric(requestquerystring("wpage"))=true then

pagenum=int(requestquerystring("wpage"))rspagesize-rspagesize+1

'根据获取的分页序号,计算此分页第1条数据位置

end if

if requestquerystring("pagenum")<>"" and isnumeric(requestquerystring("pagenum"))=true then

pagenum=int(requestquerystring("pagenum"))

end if

if (pagenum mod rct)=0 then '计算当前 分页所在页次,不是分页序号,注意区分概念

nowpage=pagenum /rct

else

nowpage=int(pagenum/rct)+1

end if

if nowpage<1 or pagenum > rsrecordcount then '判断参数是否超出范围

nowpage=1

pagenum=1

end if

fstpagenum=(nowpage-1)rct+1 '计算当前分页页次第一条数据

endpagenum=nowpagerct '计算当前分页页次最后一条数据

fstpage=nowpageshownum-shownum '计算当前页次的第一分页序号

endpage=nowpageshownum '计算当前页次最后分页序号

uppagenum=fstpagenum-rspagesize

nextpagenum=endpagenum+1

'将记录指针移到具体数据

rsabsoluteposition=pagenum

nowpage_fen=pagenum-1+rspagesize

if nowpage_fen mod rspagesize =0 then

nowpage_fen=nowpage_fen/rspagesize

else

nowpage_fen=nowpage_fen+1

end if

if nowpage_fen>rspagecount then

nowpage_fen=1

end if

%>

<%responseWrite "当前显示第" & nowpage_fen & "页记录"%>

,每页显示<%=rspagesize%>条,<%=rsrecordcount%>条记录分<%=rspagecount%>页<br>

<%

for i=0 to rspagesize

if i < rspagesize then

i=+i

if rsbof=false and rseof=false then

responsewrite rsFields("title") & "<br>"

rsmovenext

end if

end if

next

%><br>

<% if fstpage>1 then ' 用当前页次的第一分页序号判断是否还有前一页次

responseWrite "<a href=6aspwpage=1>" & "第1页" & "</a> "

responseWrite "<a href=6asppagenum=" & uppagenum & ">"& "<<" & "</a> "

end if

if nowpage_fen>1 then

responseWrite "<a href=6aspwpage=" & nowpage_fen-1 & ">"& "<" & "</a> "

end if%>

<%

for i=fstpagenum to endpagenum step(rspagesize)

if i < endpagenum and i <= rsrecordcount then

fstpage=fstpage+1

if i=pagenum then

responsewrite "<a class=a01 href=6asppagenum=" & i& ">"

else

responsewrite "<a href=6asppagenum=" & i & ">"

end if

responsewrite fstpage & "</a> "

end if

next

%>

<%if nowpage_fen < rspagecount then

responseWrite "<a href=6aspwpage=" & nowpage_fen+1 & ">"& ">" & "</a> "

end if

if endpage< rspagecount then ''用当前页次的最后分页序号判断是否还有下一页次

responseWrite "<a href=6asppagenum=" & nextpagenum & ">"& ">>" & "</a> "

responseWrite "<a href=6aspwpage=" & rspagecount & ">"& "最末页" & "</a> "

end if%>

<form id="form1" method="get" action="6asp">

转到第

<input name="wpage" type="text" size="3" maxlength="3" >

<input type="submit" value="提交">

</form>

<%rsClose()

Set rs = Nothing

%>

select from everyday where riqi >= '"&riqiks_a&"' and riqi<='"&riqijs_a&"' and beizhu='"&beizhu_a&"' order by riqi desc

不过建议日期型,不要用这种计算,低效率了

应该riqi between '"&riqiks_a&"' and '"&riqijs_a&"' 比较高效些

关键就是这句话了,与下面分页连接没有啥关系,你把这个在查询分析器器,哦,MYSQL是PHPmyadmin,把上述代码赋值后测试一下实际的记录数,如果记录数和你程序中的结果不一致,很明显你结果显示的循环模块出问题了

在SQL2005中,使用ROW_NUMBER()进行分页,效率极高

DECLARE @pagenum AS INT, @pagesize AS INT

SET @pagenum = 2

SET @pagesize = 10

SELECT

FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum,

newsid, 其它字段名 FROM 表名 where 条件) AS D

WHERE rownum BETWEEN (@pagenum-1)@pagesize+1 AND @pagenum@pagesize

每次取的数据集是有总条数的

数据集 有当前页,总页数的属性

然后就可以分页啦

rspagecount

rsabsolutepage

MYSQL 分页最简单了 SELECT FROM Account WHERE (usertype='base' or usertype='home' or usertype='salse') and logindate is not null order by logindate desc LIMIT 起始行, 每页多少行 LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)

以上就是关于数据库避免n+1,但是怎么分页全部的内容,包括:数据库避免n+1,但是怎么分页、最近遇到一个分页问题,该如何计算每页的起始地址,由于没有存到数据库,分页时每次都要重新生成IP地址、ASP的分页问题(运行结果为一个空白且读不出数据库的东东)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10101671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存