数据库分页技术

来源:互联网 发布:日程计划表软件 编辑:程序博客网 时间:2024/05/18 03:01

数据库分页技术


      • 数据库分页技术
        • 概述
        • 数据库分页的核心
          • 分页SQL语句的写法
          • 分页过程及其相应javabean的设计
        • 总结


概述


凡是采用数据库做底层存储的应用系统,肯定都会用到数据库的分页功能,可能出于以下的原因:

  • 数据库中的数据有10000行,我们需要将该数据展示在Jsp页面上,但是1000条数据做展示显示效果太差;
  • 需要将数据库中的数据做分层抽样时,我觉得首先将数据库做分页,接着对分页的数据做随机抽样,应该是一个很自然的想法;
  • 其它一些应用场景

在我的现实需求中,基于上面的一些原因,我需要对数据库进行分页,于是有了这篇文章。

数据库分页的核心


数据库分页技术有两大核心,下面分别介绍。

分页SQL语句的写法

针对不同的数据库,会有不同的分页SQL语句规范,但是我的系统只涉及MySQL、PostgreSQL、Greenplum分布式集群,所以我写的SQL语句对于上述三种数据库是通用的,如果是对除此之外的数据库进行分页操作,请先熟悉该种类型数据库的分页SQL语句。

对于MySQL数据库和PostgreSQL数据库,它们都支持一个比较cool的特诊,该特征被称为OFFSET,OFFSET通常被用在LIMIT子句中。LIMIT子句常常用来限制SQL语句返回的结果,在一个表中如果你有1000行数据,但是仅仅想要返回其中的前10行,那么你应该采用下面的SQL语句:

select column from table LIMIT 10;

LIMIT字句的功能和在Microsoft SQL Server中的TOP子句十分的相似。

假设你想显示第11行到20行的数据,那么此时你应该使用OFFSET关键字,像这面这个查询一样:

select column from table LIMIT 10 OFFSET 10;  -- 请注意OFFSET偏移量从从0开始,10代表从数据的第11条数据开始,limit 10代表总共读取10条数据

这使得编写分页SQL语句变得容易,通常使用的方法是选择所有记录,然后在应用程序服务器层上通过它们进行筛选,而不是直接在数据库上筛选。正如你想象的,在数据库上这样做会产生更好的性能。我知道PostgreSQL支持OFFSET关键字有相当长的一段时间,并且由于某种原因,我一直认为它不被MySQL支持。事实证明,MySQL数据库现在支持。

从上面的SQL语句中,我们可以总结出下面的计算规律:

  • OFFSET num 这个num的计算方法是(当前页-1) * 每页显示的行数,这样我们就能得到每页的全部数据
  • LIMIT num 这个num是每页显示的数据数目,由开发人员决定
分页过程及其相应javabean的设计

从分页SQL中我们知道,进行数据库分页,需要明确的传递以下参数:

  • 当前页
  • 查询返回的行数
  • 总页数
  • 总记录数

这些数据在分页经常会遇到,所以,我们会选择将这些数据封装成Javabean,该结构是分页中最重要、最核心的结构。

总结


分页的用途十分广泛。

0 0