************如何实现分页加速查询*************
现在分页已经有了。但是如果查询的数据量超过10万的话,那么速度就很慢了。
有没有高手可以给点提示,如何解决一下,比如一次查询就差出来一页的数据量,10条,那么翻页就查出来下一个10条,这样速度就提上去了。不知道如何实现,在那里突破;
现在的每次翻页都是把数据库里面的全部查询一次,只是显示选择的页而已。
[解决办法]
你怎么分页的?
[解决办法]
数据库里面可以限制你查的记录从多少条到多少条的啊!
[解决办法]
用Hibernate里的分页查询
[解决办法]
mysql limit
sql2000 top
oracle rownum
[解决办法]
http://zhidao.baidu.com/question/70930846.html 百度知道
[解决办法]
select top页面 ×显示数 where id not in (select top (页面-1) ×显示数)
[解决办法]
mark
[解决办法]
第n页. 每页显示x条
mysql: SELECT * FROM USER limit (n - 1) * x, x
sql2000: SELECT * FROM (SELECT TOP n * x FROM USER) WHERE id NOT IN (SELECT TOP (n - 1) * x id FROM USER);
oracle: SELECT * FROM (
SELECT users.*, ROWNUM RN FROM (SELECT * FROM USER) users
WHERE ROWNUM < (n * x)
)
WHERE RN >= (n - 1) * x
USER
id | username | password
------------------------
| |
| |
| |
[解决办法]
hibernate: getSession().createQuery("FROM User").setFirstResult(开始记录数).setMaxResults(每页显示多少条);
[解决办法]
肯定是后台动手脚了
每次查询只取出当前页面的数据量
看你用什么了
9楼10楼不错
[解决办法]
LZ的是假分页。
[解决办法]
每次翻页的时候,就去查询一下数据库,给一个查询的范围,比如从21——30条,这个应该很好实现啊~~
楼主不会是直接把所有的数据全部都load出来了吧~~
[解决办法]
分页一般有两种 一种就是楼主这样的
适合于数据量小 并且适合换数据库
第二种就是每次只查询每页显示的条数
第二种方法实现的方式有很多 我最喜欢用的就是
搞一个自定义分页标签 这样每次查询的时候只要直接拿过来
修改表名等信息 就可以了
但是自定义标签好像不可以和ajax做集成(数据展示用到ajax)
至于具体的自定义标签网上一大把
[解决办法]
在数据库中分页感觉是最快的!
[解决办法]
Hibernate里的分页查询
[解决办法]
我处理过最多的数据时45万条,SqlServer2005 不能使用top 使用top超慢,还不如使用结果集分,
9楼和10楼 是目前最好的解决办法了
[解决办法]
使用预抓取
[解决办法]
- Java code
import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.util.Vector;/** * Pager, 基于 JDBC 2.0 滚动机制的分页程序, 在 MySQL, SQLServer, Access, Oracle 下测试通过. * */public class Pager { /** Used database connection */ Connection conn = null; public Pager() { } /** * * 分页功能, 返回当页的数据(JDBC 2.0 实现). * @param currentPage * 当前页面数(取值范围: 从 1 开始有效, 0 自动改为 1) * @param pageCount * 每页显示记录 * @return a Vector - 数据列表 */ public Vector pageData(int currentPage, int pageCount) { Vector results = new Vector(); String tableName = "table_name";// 要处理的表格名 ResultSet rs = null; String sql = "SELECT * FROM " + tableName; Statement stmt = null; try { // 生成可滚动的结果集表达式 stmt = conn.createStatement(ResultSet. TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(sql); int count = recordCount(); // 总记录数 int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 总页面数 if (currentPage <= 0) { currentPage = 1; } // 超出页码范围, 不返回数据 if (currentPage > totalPage) { currentPage = totalPage; return results; } if ((currentPage - 1) * pageCount > 0) { // 移动结果集数据到当前页 rs.absolute((currentPage - 1) * pageCount); } // rs.absolute(0); 在 ODBC 下会导致如下异常:java.sql.SQLException: Cursor // position (0) is invalid int i = 0; // Readed pages while (rs.next() && i < pageCount) { i++; } } catch (Exception exception) { System.out.println("Occur a error in " + getClass() + ".pageData() : " + exception.getMessage()); } finally { closeJDBCResource(stmt); closeJDBCResource(rs); closeJDBCResource(conn); } return results; } /** * * 返回当前数据库中记录的总数. * @return int 记录总数 */ public int recordCount() { int allCount = -1; String tableName = "table_name";// 要处理的表格名 String sql = "SELECT COUNT(*) FROM " + tableName; ResultSet rs = null; Statement stmt = null; try { stmt = conn.createStatement(); rs = stmt.executeQuery(sql); if (rs.next()) { allCount = rs.getInt(1); } } catch (Exception exception) { System.out .println("Occur a error in " + getClass() + ".recordCount() : " + exception.getMessage()); } finally { closeJDBCResource(stmt); closeJDBCResource(rs); closeJDBCResource(conn); } return allCount; } /** * Close a jdbc resource, such as ResultSet, Statement, Connection.... All * these objects must have a method signature is void close(). * @param resource - * jdbc resouce to close * */ public static void closeJDBCResource(Object resource) { try { Class clazz = resource.getClass(); java.lang.reflect.Method method = clazz.getMethod("close", null); method.invoke(resource, null); } catch (Exception e) { e.printStackTrace(); } } /** * * Test page. * @param args * */ public static void main(String[] args) { // 分页, 读取第一页数据, 共读取5个记录 Vector data = new Pager().pageData(1, 5); // TODO: process value object, 更改类名 /* * for(int i = 0; results != null && i < data.size(); i++) { * * ValueObject bean = (ValueObject)data.get(i); * } */ }}
[解决办法]
假设是User表
主键是id
当前要查询第2页, 每页显示5条数据
sqlserver 环境
SELECT * FROM (SELECT TOP n * x FROM USER) WHERE id NOT IN (SELECT TOP (n - 1) * x id FROM USER);
FROM子句中的n*x 就等于2 * 5 = 10;
WHERE子句中的(n - 1) * x 就等于(2-1)*5 = 5;
最后得到的sql(呵呵..不好意思...上面的语法有点问题.)
SELECT * FROM (SELECT TOP 10 * FROM user) AS users WHERE users.id NOT IN (SELECT TOP 5 id FROM user);
这里是使用了主键...其实...任何的unique的列都是可以作为WHERE子句中的那个集合条件的....当然..如果你的数据库设计的够规范(主键与业务无关)....那么用主键是最好不过了....毕竟, 其他与业务有关的东西是可能会变更成为非unique的列的.