本文共 5483 字,大约阅读时间需要 18 分钟。
数据分页功能的实现是在任何一个项目中都非常实用的一个功能,在ASP学习的时候,曾写过一篇关于分页功能的实现(),上面已经介绍的真假分页的优缺点,在这里我们就不过多的赘述了。现在的分页实现依赖于EasyUI前台框架的强大功能,那么接下来就让我们看看数据分页在Easyui中的实现吧!
分页往往是依附于数据表格的,所以我们就使用的是easyui的datagrid组件,来开启pagination分页组件,为了方便,我们使用JS实现。
---语句样式: 中,可用如下方法:SELECT * FROM 表名称 LIMIT M,N。
---适应场景:适用于数据量较少的情况(元组百/千级)。
---原因/缺点:全表扫描,速度会很慢且 有的结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3)。Limit限制的是从结果集的M位置处取出N条输出,其余抛弃。
方法2:建立主键或唯一索引,利用索引(假设每页10条)
---语句样式: MySQL中,可用如下方法:
SELECT *FROM 表名称 WHERE id_pk > (pageNum*10)LIMIT M。
---适应场景: 适用于数据量多的情况(元组数上万)。
---原因:索引扫描,速度会很快。有朋友提出因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3。
方法3:基于索引再排序
---语句样式: MySQL中,可用如下方法:SELECT * FROM 表名称 WHERE id_pk >(pageNum*10) ORDER BY id_pk ASC LIMIT M。
---适应场景: 适用于数据量多的情况(元组数上万).最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)。
---原因:索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待)。
方法4: 基于索引使用prepare(第一个问号表示pageNum,第二个?表示每页元组数)
---语句样式: MySQL中,可用如下方法:
PREPAREstmt_name FROM SELECT * FROM 表名称 WHEREid_pk > (?*?) ORDER BY id_pk
ASC LIMIT M。
---适应场景:量。
---原因:索引扫描,速度会很快. prepare语句又比一般的查询语句快一点。
方法5:利用MySQL支持ORDER操作可以利用索引快速定位部分元组,避免全表扫描
---比如:读第1000到1019行元组(pk是主键/唯一键)。
---SELECT *FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20。
方法6:利用"子查询/连接+索引"快速定位元组的位置,然后再读取元组.道理同方法5
---如(id是主键/唯一键,蓝色字体时变量):
利用子查询示例:
1 2 3 4 | SELECT *FROM your_tableWHERE id <= (SELECT idFROM your_tableORDER BY iddesc LIMIT ($page-1)*$pagesizeORDER BY iddesc LIMIT $pagesize |
利用连接示例:
1 2 3 4 5 | SELECT *FROM your_tableAS t1 JOIN (SELECT idFROM your_tableORDER BY id desc LIMIT ($page-1)*$pagesize AS t2 WHERE t1.id <= t2.id ORDER BY t1.iddesc LIMIT $pagesize; |