首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

*怎么实现分页加速查询*

2012-01-29 
************如何实现分页加速查询*************现在分页已经有了。但是如果查询的数据量超过10万的话,那么

************如何实现分页加速查询*************
现在分页已经有了。但是如果查询的数据量超过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的列的.

热点排行