数据库应用-数据库应用有用的技巧-–分页实现-分页实现 (数据库应用技术)

教程大全 2025-07-17 10:30:21 浏览

随着互联网和移动互联网的发展,数据量急剧增长,数据库的应用变得越来越普及和必要。数据库应用的一个关键问题是如何快速高效地查询和展示数据,特别是对于大量数据的情况下。分页查询是一个解决这个问题的常见方法,下面将对分页查询的实现进行详细介绍。

一、分页查询的基本原理

分页查询是指将大量的数据按照一定的规则进行分割,每次只查询一部分数据,这样可以减少数据库查询的负担,提高查询速度,同时也可以一定程度上避免数据重复查询。分页查询需要指定每页显示的记录数和当前要查询的页数。其基本原理如下:

1. 计算总页数:总页数=总记录数/每页显示的记录数,对总记录数进行取整操作(向上取整或向下取整)得到总页数。

2. 查询当前页的记录:根据当前页数和每页显示的记录数计算出需要查询的记录范围(起始记录数和结束记录数),然后查询这个范围内的记录数据。

3. 显示当前页的记录:将查询到的记录数据按照一定的格式展示在前端页面上,同时需要提供翻页功能,方便用户浏览其他页面的数据。

二、分页查询的实现方法

分页查询可以使用多种方式实现,下面介绍几种常见的分页查询方法:

1. LIMIT OFFSET 方法:

在 MySQL 数据库中,可以使用 LIMIT OFFSET 方法实现分页查询。例如查询前 10 条数据:SELECT * FROM table LIMIT 0,10;查询第 11 ~ 20 条数据:SELECT * FROM table LIMIT 10,10。其中,LIMIT 后面的之一个参数表示查询数据的起始位置(索引从 0 开始),第二个参数表示查询的数据数量。

2. ROW_NUMBER 方法:

ROW_NUMBER 是一个关键字,在 SQL Server 和 Oracle 数据库中都适用。通过 ROW_NUMBER,可以为每行数据附上一个序号,再根据序号进行分页查询。例如查询前 10 条数据:SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNumber,* FROM table ) AS T WHERE T.RowNumber BETWEEN 1 AND 10;查询第 11 ~ 20 条数据:SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNumber,* FROM table ) AS T WHERE T.RowNumber BETWEEN 11 AND 20。

3. 数据库函数方法:

MySQL 和 Oracle 数据库均提供了内置函数实现分页查询功能。例如 MySQL 数据库使用 limit 函数:SELECT * FROM table LIMIT 0,10;Oracle 数据库使用 rownum、select、from、where 条件语句联合查询:SELECT * FROM (SELECT rownum rn ,a. * FROM table a WHERE rownum = 1。

4. Hibernate 分页查询:

Hibernate 是一种流行的 ORM 框架,可以方便地进行分页查询。在 Hibernate 中,使用分页器(Pager)来查询每页数据。示例代码如下:

Query query = session.createQuery(“FROM User”); // 查询全部数据

pager.setTotalCount(query.list().size()); // 设置总记录数

query.setFirstResult((pager.getPageNo() – 1) * pager.getPageSize());

query.setMaxResults(pager.getPageSize());

pager.setDataList(query.list());

5. MyBatis 分页查询:

MyBatis 是一种常用的持久层框架,在其中使用分页插件 PageHelper 可以轻松实现分页查询。示例代码如下:

PageHelper.startPage(pageNum,pageSize);

List users = userMapper.list(); // 查询全部数据

PageInfo pageInfo = new PageInfo(users);

return pageInfo;

三、分页查询的优化

分页查询在实现时需要注意一些性能优化的问题,尽可能减少对数据库的压力,提高查询效率。下面介绍一些优化方法:

1. 不要查询全部数据:在进行分页查询时,不必将全部数据一次性查询出来,而是应该只查询一页数据。可以使用 LIMIT、ROW_NUMBER 等方式查询指定数据范围内的数据。

2. 避免大量重复查询:在进行分页查询时,多次查询同一范围内的数据是一种浪费资源的操作,可以使用缓存技术、排序、索引等方式避免重复查询。

3. 选取适当的数据结构:在进行分页查询时,可以使用适当的数据结构来加快查询速度,例如使用数据库索引可以避免全表扫描,提高查询效率。

4. 控制多线程的并发数量:当应用采用多线程方式访问数据库时,为避免并发冲突和效率浪费,应该控制并发数量,避免过多访问数据库。

相关问题拓展阅读:

mysql数据库分页

可以空知型使用TOP分页啊

什么斗猜数据库都猛高可以用的

例如:

一页要获取的条数

是页数

1代表的是第二页

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询。

我们先从一个常用但性能很差的查询来看一看。

数据库应用技术

ORDER BY id DESC

这个查询耗时0.00sec。So,这雀则个查询有什么问题呢?实际上,这个查询语句和参数都没有问题,因为它用到了下面表的主键,而且只读取15条记录。

CREATE TABLE city (

id int(10) unsigned NOT NULL AUTO_INCREMENT,

city varchar(128) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB;

真正的问题在于offset(分页偏移量)很大的时候,像下面这样:

ORDER BY id DESC

上面的查询在有2M行记录时需要0.22sec,通过EXPLAIN查看SQL的执行计划可以发现该SQL检索了100015行,但最后只需要15行。大的分页偏移量会增加使用的数据,MySQL会将大量最终不会使用的数据加载到内存中。就算我们假设大部分网站的用户只访问前几页数据,但少量的大的分页偏移量的请求也会对整个系统造成危害。Facebook意识到了这一点,但Facebook并没有为了每秒可以处理更多的请求而去优化数据库,而是将重心放在将请求响应时间的方差变小。

对于分页请求,还有一个信息也很重要,就是总共的记录数。我们可以通过下面的查询很容易的获取总的记录数。

SELECT COUNT(*)

然而,上面的SQL在采用InnoDB为存储引擎时需要耗费9.28sec。一个不正确的优化是采用 SQL_CALC_FOUND_ROWS,SQL_CALC_FOUND_ROWS 可以在能够在分启岁历页查询时事先准备好符合条件的记录数,随后只要执行一句 select FOUND_ROWS(); 就能获得总记录数。但是在大多数情况下,查询语句简短并不意味着性能的提高。不幸的是,这种分页查询方式在许多主流框架中都有用到,下面看看这个语句的查询性能。

SELECT SQL_CALC_FOUND_ROWS *

ORDER BY id DESC

这个语句耗时20.02sec,是上一个的两倍。事实证明使用 SQL_CALC_FOUND_ROWS 做分页是很糟糕的想法。

下面来看看到底如何优化。文章分为两部分,之一部分是如何获取记录的总数目,第二部分是获取真正的记录。

高效的计算行数

如果采用的引擎是MyISAM,可以直接执行COUNT(*)去获取行数即可。相悄搜似的,在堆表中也会将行数存储到表的元信息中。但如果引擎是InnoDB情况就会复杂一些,因为InnoDB不保存表的具体行数。

我们可以将行数缓存起来,然后可以通过一个守护进程定期更新或者用户的某些操作导致缓存失效时,执行下面的语句:

SELECT COUNT(*)

USE INDEX(PRIMARY);

获取记录

下面进入这篇文章最重要的部分,获取分页要展示的记录。上面已经说过了,大的偏移量会影响性能,所以我们要重写查询语句。为了演示,我们创建一个新的表“news”,按照时事性排序(最新发布的在最前面),实现一个高性能的分页。为了简单,我们就假设最新发布的新闻的Id也是更大的。

CREATE TABLE news(

id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

title VARCHAR(128) NOT NULL

) ENGINE=InnoDB;

一个比较高效的方式是基于用户展示的最后一个新闻Id。查询下一页的语句如下,需要传入当前页面展示的最后一个Id。

FROM news WHERE id $last_id

ORDER BY id ASC

LIMIT $perpage

上面的查询方式适合实现简易的分页,即不显示具体的页数导航,只显示“上一页”和“下一页”,例如博客中页脚显示“上一页”,“下一页”的按钮。但如果要实现真正的页面导航还是很难的,下面看看另一种方式。

SELECT id, ((@cnt:= @cnt + 1) + $perpage – 1) % $perpage cnt

JOIN (SELECT @cnt:= 0)T

WHERE id = $offset

ORDER BY OFFSET

LIMIT $perpage;

简单来说,对于分页的优化就是。。。避免数据量大时扫描过多的记录。

数据表

$num,$pages;

//(当前页数-1)乘以每页胡早条数

$pages//每页条数

这样就陪搭可以了

首页

下一页

$page=$_GET+1;

上芦做拿一页

$page=$_GET-1;数据库应用 –分页实现的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库应用 –分页实现,数据库应用有用的技巧:分页实现,mysql数据库分页的信息别忘了在本站进行查找喔。

香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。


请懂得软件工程师考试的高人入内?

软件工程师证书,是有社会培训机构通过培训考核发给的有关证书。 与国家计算机软件水平资格考试不一样。 如JAVA如件工程师,其培训内容包括: 初级部分: 1. Java 面向对象程序设计、Java API使用、数据结构及算法基础、Java高级类特性、异常处理; 2. AWT及Swing图形程序设计、流、网络程序设计、对象序列化、Applet、多线程程序设计、Java应用国际化基础; 3. Java桌面系统项目开发; 4. Java编程基础提高课程:反射机制、设计模式(I)、正则表达式,Java SE5.0新特性等; 5. 基于Oracle的数据库开发及管理、数据库设计、标准SQL、PL/SQL编程; 6. JDBC、JSP2.0、Servlet2.4、JavaBean编程;Tomcat服务器使用、Jbuilder及Eclipse 等集成开发环境; 7. Linux操作系统中的Java程序开发、Linux系统管理; 8. Java Web编程提高课程:JDBC进阶、高效分页处理、过滤器使用技巧、Struts中动态表单验证、DispatchForm等; 高级部分 1. MVC设计模式、Struts架构核心工作机制、国际化、验证框架、Struts Taglib、ORM基础、基于Hibernate的企业级应用; 2. JavaME手机游戏设计、界面程序设计、数据库程序设计、手机短信、多媒体短信(彩信)开发; 3 核心技术、XML、Web Service、异构系统整合、分布式应用开发、weblogic和JBoss等应用服务器; 4 、UML与系统建模和设计、Rational Rose、软件工程和软件过程模型、版本控制及设计模式; 6. Java 企业级应用开发提高课程:Hibernate使用技巧、设计模式(II)、Spring编程入门、提高Java EE应用的性能; 程序设计 架构、桌面和Web程序设计、与JavaEE平台应用的整合; 职业素质 IT职业规划、沟通技巧、团队合作、专业技术规范、面试技巧等职业技能培训。 完成以上培训课程后,通过考核就可以获得培训机构颁发的合格证书。 现在比较吃香的是JAVA,特别是J2EE,未来3G出来后,手机编程将成为热点,J2EE当然就会很吃香了。 关于证书的权威性,建议你要去知名的培训机构去,最好是像SUN这类国际大公司有关认证所指定的培训机构,这样权威性高些。 一般来讲,软件公司是非常喜欢通过了软件工程师的人员,学历对他们来说并不重要,而重要的是能力。 如果你的能力够强,在一个好的公司的话,这个月薪我想应该是可以拿到的。 其他方面的软件权威考试,在国内当然就是国家计算机软件水平资格考试了。 这是国家级的考试。 回答应该比较详细,应该能得旗了吧。 。

jsp servlet javabean mysql 如何实现分页

javabean写的mysql分页如下:/** To change this template, choose Tools | Templates* and open the template in the editor.*/package ;/**** @author asus*/import .*;import .*;public class SPLitPage{//定义结果集对象private ResultSet rs=null;private ResultSetMetaData rsmd=null;//总记录数目private int rowCount;//所分的逻辑页数private int pageCount;//每页显示的记录数目private int pageSize; //初始化,获取数据表中的信息public void initialize(ResultSet rs,int pageSize){=pageSize;try{=rs;=();if (!=null){(); = ();(); = ( - 1) / + 1;}else{=0;}}catch(SQLException e){(());}} //将显示结果存到Vector集合类中public Vector getPage(int ipage){Vector vData=new Vector();int n=ipage;int m=0;m=(n-1)*+1;try{if (!=null){if (n!=1){(m);}for(int i=0;i

PHP高级程序员要懂什么?

程序员可以分为很多种,像Unix程序员、Windows程序员,或是C++程序员、Delphi程序员,等等。 今天我想谈的是Web程序员,一名真正的Web程序员应该懂得那些方面的知识,应该注意学习哪些东西。 也许有些朋友会说,我知道Asp、Jsp,会做网站、会做bbs,这应该叫Web程序员了吧。 确实,我承认,这些技术是一名Web程序员应该具备的;但是,你如果仅懂得这些,却只能叫做Asp程序员、Jsp程序员,而不是真正意义上的Web程序员。 现在的世界是属于Internet的,大部分的应用基于Internet,大家可以想想,像Yahoo、Microsoft、Amazon那样的网站,其访问量之大、应用之复杂,需要什么样的技术才可以支撑,难道仅仅是硬件的功劳么。 我想在Windows平台下来谈谈Web程序员应该掌握的技术 1. 首先,就是上面提到的各种脚本,asp、jsp、php等等,这些东西大同小异,基本可以举一反三。 2. 数据库, 相信做Web的人肯定用过,像Access、Sql Server、Oracle。 很多人会用各种数据库,但是仅限于写一些sql,select、update、insert,用ADO来操作,如果这样,就算会用100种数据库又有什么用呢? 你应该考虑用户量、访问速度、内存消耗,这些东西和你的sql密切相关,我经常见到很多分页程序根本不去考虑数据库中有多少条数据,统统select出来,很明显,当你从数据库中查出1万条数据和100条数据,占用的内存是不同的。 另外,数据库连接池和事务机制是非常重要的,应该知道数据库用什么来保证事务,连接池如何实现,这些都是商务应用的关键。 譬如,目前很多的应用服务,像weblogic、MTS,都包含事务处理,可以说好的事务处理决定了他们的竞争力。 3. 组件技术 我想是现在的Web应用推动了组件技术的发展。 以前,从老式的静态库、动态库(dll),到现在的COM/DCOM,再到正在兴起中的Web Service;从单机调用,到基于内部网的分布式调用,到现在基于Internet的分布式计算。 现在的应用都是基于组件的n层结构,最明显的就是COM和JavaBean。 这些东西体现了软件架构的发展,以前是基于单机的应用,然后是C/S结构,到现在的B/S结构。 我记得李维曾经说过,程序员一定要注意软件技术的发展趋势,只有这样,才不至于被淹没在技术的洪流中。 我想,作为Web程序员,一定要明白COM的原理,如何实现这种调用、如何进行分布式调用。 说实话,我觉得COM还是比较复杂的,否则微软为什么要提供ATL和VB呢,要搞明白,应该学学C++,因为VC中提供的ATL库可以很明显的说明COM的内部运行机制。 4. 网络技术 这可以说是Web程序员最应该懂得东西。 起码,应该知道Web服务器的机制,要明白Http协议。 就拿IIS来说,要懂得web应用程序运行的进程安全和IIS的关系,懂得ISApi的作用。 如果有时间,就看看TCP/IP,看看winsock,这些都是底层的网络的东西。 我所说的这些都是基于微软技术下的东西,其他的像Java方面的东西都可以对照参考,就不多说了,这也是我这几年来的一些心得。 总之,学海无涯,每当接触一些新的东西,就会发现自己的不足,同时也就觉得基础知识的重要。 说实话,像我们做应用开发,用别人的东西,在现在这种情况下,新的技术层出不穷,稍不注意就会被甩开,这也是没有办法的事情。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐