开发中经常用到分页查询,一般都是用服务器端分页。都知道分页的查询效率高。至于为什么高,我一直不太明白。
我的理解是:
比如一张表中有100W条数据,分页查询(pageSize=10)
优势一:每次查询的数据只有10条(不是一次查询100W条),因此查询效率快了一些。
优势二:响应到客户端的数据只有10条(不是一次全部响应100W条),因此 响应的效率又高了一些。
是不是这样???????
别的地方我也不知道哪里效率高了。
假如只有这两个地方效率高了,那么看看下边的例子
selct * from A.
selct count(*) from (select * from A)
要分页就要得到总记录数,我的查询条件不确定,可能是多表连接查询,我只能想到这种获得总数的方法(哪位大侠知道更好的方法请告知????????)。
这样的话,每次分页查询之前我都需要用到count(*),这样一来每次都执行了select * from A 的操作。
这样的话 查询效率高的优势(优势一)就没有了,只是响应到客户端的效率高了(优势二)。这样理解对么?????????
这样以来分页还有意义么?????
优势一和优势二到底哪个对查询效率影响比较大????????换句话说,一次全部查询比较慢,慢在哪里,是一次查询全部数据比较影响效率,还是一次把所有数据响应到客户端比较影响效率?????????????????????结尾的是我的问题
我的理解是:
比如一张表中有100W条数据,分页查询(pageSize=10)
优势一:每次查询的数据只有10条(不是一次查询100W条),因此查询效率快了一些。
优势二:响应到客户端的数据只有10条(不是一次全部响应100W条),因此 响应的效率又高了一些。
是不是这样???????
别的地方我也不知道哪里效率高了。
假如只有这两个地方效率高了,那么看看下边的例子
selct * from A.
selct count(*) from (select * from A)
要分页就要得到总记录数,我的查询条件不确定,可能是多表连接查询,我只能想到这种获得总数的方法(哪位大侠知道更好的方法请告知????????)。
这样的话,每次分页查询之前我都需要用到count(*),这样一来每次都执行了select * from A 的操作。
这样的话 查询效率高的优势(优势一)就没有了,只是响应到客户端的效率高了(优势二)。这样理解对么?????????
这样以来分页还有意义么?????
优势一和优势二到底哪个对查询效率影响比较大????????换句话说,一次全部查询比较慢,慢在哪里,是一次查询全部数据比较影响效率,还是一次把所有数据响应到客户端比较影响效率?????????????????????结尾的是我的问题
解决方案 »
- JSP跳转servlet出现下载框
- UrlRewrite带参数的url静态化问题
- 用struts2的bean标签new一个javabean对象时javabean的构造方法怎么不起作用呢?难道new时没调用构造方法?
- struts 如何遍历map
- 高分求助weblogic 7.0 sp5突然失去响应的问题
- 求Hibernate代码实例
- 在jsp页面中的某一个table中,在某一列的每个td上,鼠标放在每个td上,都会弹出一个对话框,鼠标移开对话框消失,我实现了,但是还是有一些问题。
- 【提问】applet传递对象给servlet
- 为什么我读文本读出来中文没办法显示啊.
- 刚刚发现了一个问题,mysql的JDBC2和3有区别
- 求一个STRUTS2 SQLSERVER2000的连接池的代码,最好有个例子
- hibernate调用带返回值的存储过程,结果总是1
selct count(*) from (select * from A)
首先这2条语句的效率是不能等同的,在select * from A中万一你的数据库字段有很多,查询起来就会慢,开发中不建议使用*。
你说到的分页查询效率的问题也只说到了一部分。
假设现在你有1百万数据,现在不说效率问题,光显示到网页上就让人没法看吧,现在你说用分页查询不。
分页的主要用途是清晰,简单的给用户呈现出信息。用到分页当然效率会比一般查询效率高,企业不是因为效率高才用的分页,你要明白。
其实你看到的数据根本不是全部数据 ,还原出来的语句其实在后面加了 limit 。
页面实现分页的原理跟查询分析器 的原理是一样的
selct count(*) from (select * from A)
我知道他们的效率不同,我的意思是当多表连接查询的时候,我要获得总记录数,我只能想到从结果集中count(*),selct * from A.就是我的结果集,只是举个例子。
分页不是为了小率高的话,完全可以用客户端分页啊,那样照样可以使结果很清晰的啊
where后的参数条件:
<sql id="param_post">
<isNotEmpty prepend=" AND " property="menuPostId">
T.MENU_POST_ID = #menuPostId#
</isNotEmpty>
<isNotEmpty prepend=" AND " property="trainForm">
M.TRAIN_FORM = #trainForm#
</isNotEmpty>
<isNotEmpty prepend=" AND " property="postLevelCode">
S.POST_LEVEL_CODE = #postLevelCode#
</isNotEmpty>
</sql>// 查询语句
<select id="query" parameterClass="java.util.HashMap"
resultClass="java.util.HashMap">
SELECT
T.POST_NAME as "postName",
T.ORG_ID as "orgId",
T.PROJECT_NO as "projectNo" ,
M.PROJECT_NAME as "projectName" ,
M.PROJECT_TYPE as "projectType" ,
M.MANAGE_MODE as "manageMode" ,
S.JOB_CODE as "jobCode",
S.JOB_TYPE_CODE as "jobTypeCode"
FROM
T_HRTR_TRAIN_YR_MENU M,
T_HRPO_POSITION S,
T_HRTR_TRAIN_MENU_POST T
WHERE
T.menu_no = M.menu_no
AND
T.post_code = S.post_code
AND M.ALIVE_FLAG = '1'
AND S.ALIVE_FLAG = '1'
AND T.ALIVE_FLAG = '1' <include refid="HRTRTrainMenuPost.param_post" />
</select>// 查询数量:
<select id="count" resultClass="int">
SELECT COUNT(*) FROM
T_HRTR_TRAIN_YEAR_MENU M,
T_HRPO_POSITION S,
T_HRTR_TRAIN_MENU_POST T
WHERE
t.menu_no = m.menu_no
and
t.post_code = s.post_code
AND M.ALIVE_FLAG = '1'
AND S.ALIVE_FLAG = '1'
AND T.ALIVE_FLAG = '1'
<include refid="HRTRTrainMenuPost.param_post" />
</select>