jquery easy ui 分页

为了解决大数据量下显示数据的问题,咱们须要这样的一个效果:用户每次操做分页工具栏的时候向数据库获取新的数据,服务器根据传递回的参数肯定须要获取的数据段,而后查询数据库获取指定若干行的数据,再传递给前台由Datagrid显示出来。javascript

首先,设置datagrid的初始化java

[javascript] view plain copy print ? 在CODE上查看代码片 派生到个人代码片
  1. $(function() {  
  2. $('#tableTrainee').datagrid('getPager').pagination({  
  3.                 pageSize: 10, //每页显示的记录条数,默认为10    
  4.                 pageList: [10, 15, 20, 25], //能够设置每页记录条数的列表  
  5.                 onSelectPage: function(pageNumber, pageSize) {  
  6.                 SearchTrainee();//每次更换页面时触发更改   
  7.                }  
  8.             });  
  9.    });  

其中的SearchTrainee()方法在每次更新页面的时候都会被加载一次。sql

其次,获取数据并加载       数据库

[javascript] view plain copy print ? 在CODE上查看代码片 派生到个人代码片
  1. function SearchTrainee() {  
  2.            functionSearchTrainee() {  
  3.            var companyCode =$('#hiddenCompanyCode').val();   
  4.            var name = $('#txtName').val();  
  5.            if (companyCode== "") companyCode = "000";  
  6.            var dg =$('#tableTrainee');  
  7.            var opts =dg.datagrid('options');  
  8.            var pager =dg.datagrid('getPager');  
  9.            var _pageNumber =opts.pageNumber;  
  10.            var _pageSize =opts.pageSize;  
  11.            //异步获取数据到javascript对象,入参为查询条件和页码信息  
  12.            $.post('Ajax/GetTraineeHandler.ashx', {  
  13.                Name: name,  
  14.                CompanyCode:companyCode,  
  15.                pageNumber:_pageNumber,  
  16.                pageSize:_pageSize  
  17.            }, function(data) {  
  18.            //注意此处从数据库传来的data数据有记录总行数的total列  
  19.               var total = JSON.parse(data).rows[0].total;  
  20.               $('#tableTrainee').datagrid('loadData', JSON.parse(data));  
  21.               pager.pagination({  
  22.               //更新pagination的导航列表各参数  
  23.               total:total,//总数  
  24.               pageSize: _pageSize,//行数  
  25.               pageNumber: _pageNumber//页数  
  26.                });  
  27.   });  
  28.        }  

下面的工做就是使用服务器获取数据库的数据了。服务器

按照以上要求的话,数据库的查询语句就不能使用 count(*),select * 相似须要全局搜索的语句了,由于其太耗时了。异步

网上牛人关于分页搜索语句的帖子很是的多,搜索方法多种多样,这里我采用了如下这个:工具

  1. select top 页大小 * from id   
  2. where id  not in  
  3. (   
  4. select top 页大小*(页数-1) id  from table  order by id  asc  
  5. )    

 

这个语句的优势是不用查询全部行,缺点是页码越大,查询的效率越低。例如,一次测试中获取一千万行后的10行数据,约须要1分钟。post


如今的主要问题基本是解决了,可是仍是存在很多问题:测试

1. 从服务器中获取数据总条数的时候是使用的select count(*)语句,这样的语句和select * 相似,都是须要搜索所有数据的,会致使大数据的状况下变得很慢。大数据

2. 不止能够从查询语句方面提升查询效率,若是能够的话,应该给数据库表添加索引,若是能够添加存储过程的话就更好了。


2013.12.30补充

在查询数据库的时候,也能够采用下面这条语句

  1. SELECT TOP 页大小 *  
  2. FROM table1  
  3. WHERE id >  
  4.           (  
  5.           SELECT ISNULL(MAX(id),0)   
  6.           FROM   
  7.                 (  
  8.                 SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id  
  9.                 ) A  
  10.           )  
  11. ORDER BY id  

比较下来,这个语句比上面使用not in语句的查询效率更高,但仍没法避免页码增大会致使效率变差的状况,获取1千万行之后的10行数据仍然须要1分钟以上。

获取datagrid右下角那里的总页数,不可避免的须要使用count语句,这会出现查询语句的短板,无奈~~

若是不带条件的获取总行数的话,可使用下面这条语句

SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID('tableName') AND INDID = 1

注意其获取的并不是精确值,而是服务器隔一段时间更新的数据库表总行数。

相关文章
相关标签/搜索