mysql、mssql及oracle分页查询方法详解
作者:米刀文 发布时间:2024-01-21 15:11:34
本文实例讲述了mysql、mssql及oracle分页查询方法。分享给大家供大家参考。具体分析如下:
分页查询在web开发中是最常见的一种技术,最近在通过查资料,有一点自己的心得
一、mysql中的分页查询
注:
m=(pageNum-1)*pageSize;n= pageSize;
pageNum是要查询的页码,pageSize是每次查询的数据量,
方法一:
select * from table order by id limit m, n;
该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录。无疑该查询能够实现分页功能,但是如果m的值越大,查询的性能会越低(越后面的页数,查询性能越低),因为MySQL同样需要扫描过m+n条记录。
方法二:
select * from table where id > #max_id# order by id limit n;
该查询每次会返回n条记录,却无需像方式1扫描过m条记录,在大数据量的分页情况下,性能可以明显好于方式1,但该分页查询必须要每次查询时拿到上一次查询(上一页)的一个最大id(或最小id)。该查询的问题就在于,我们有时没有办法拿到上一次查询(上一页)的最大id(或最小id),比如当前在第3页,需要查询第5页的数据,该查询方法便爱莫能助了。
方法三:
为了避免能够实现方式二不能实现的查询,就同样需要使用到limit m, n子句,为了性能,就需要将m的值尽力的小,比如当前在第3页,需要查询第5页,每页10条数据,当前第3页的最大id为#max_id#:
select * from table where id > #max_id# order by id limit 20,10;
其实该查询方式是部分解决了方式二的问题,但如果当前在第2页,需要查询第100页或1000页,性能仍然会较差。
方法四:
select * from table as a inner join (select id from table order by id limit m, n) as b on a.id = b.id order by a.id;
该查询同方式一 一样,m的值可能很大,但由于内部的子查询只扫描了字段id,而不是整张表,所以性能要强于方式一查询,并且该查询能够解决方式二和方式三不能解决的问题。
方式五:
select * from table where id > (select id from table order by id limit m, 1) limit n;
该查询方式同方式四,同样通过子查询扫描字段id,效果同方式四。至于性能的话,方式五的性能会略好于方式四,因为方式5不需要在进行表的关联,而是一个简单的比较。
二、Sql Server分页查询
方法一:
适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
)
ORDER BY id
方法二:
适用于 SQL Server 2000/2005
--顺序写法:
SELECT TOP 页大小 *
FROM table1
WHERE id >=
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小*(页数-1)+1 id FROM table1 ORDER BY id
) A
)
ORDER BY id
--降序写法:
SELECT TOP 页大小 *
FROM table1
WHERE id <=
(
SELECT ISNULL(MIN(id),0)
FROM
(
SELECT TOP 页大小*(页数-1)+1 id FROM table1 ORDER BY id Desc
) A
)
ORDER BY id Desc
方法三:
适用于 SQL Server 2005
SELECT TOP 页大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber > 页大小*(页数-1)
说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。
其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用
三、oracle分页查询
方法一:
SELECT * FROM
( SELECT A.*, ROWNUM RN FROM
(SELECT * FROM tab) A
WHERE ROWNUM <= 40 )
WHERE RN >= 21;
这个分页比下面的执行时间少,效率高。当数据量较大时oracle会自动优化!
方法二:
select * from
(select c.*,rownum rn from tab c) where rn between 21 and 40
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。
对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层
(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
希望本文所述对大家的数据库程序设计有所帮助。


猜你喜欢
- 本文实例为大家分享了python脚本筛选出两个文件中重复的行数,供大家参考,具体内容如下'''查找A文件中,与B文件
- 1. EXISTS的执行流程 select * from t1 where exists ( select null from t2 whe
- 数据库开启慢查询日志修改配置文件在配置文件my.ini中加上下面两句话log-slow-queries = C:\xampp\mysql_s
- 常用的一共有4个方法,如下:1.使用locate()方法普通用法:SELECT`column`from`table`wherelocate(
- pyyaml模块在python中用于处理yaml格式数据,主要使用yaml.safe_dump()、yaml.safe_load()函数将p
- JDBC数据库连接MySQL中建表在终端使用命令mysql -u root -p打开数据库,在数据库操作环境下进行创建数据库,建表等等操作建
- 数据共享是数据库最基本的特征之一。但是数据共享虽然为员工带来了便利,但也产生了一些负面作用。例如因用户并发存取而导致的对数据一致性的破坏、由
- 分享一下 IntelliJ IDEA 2021.1 的激活破解教程,相当于永久激活了,亲测有效,下面是详细文档哦~申明:本教程 Intell
- 这篇文章主要介绍了python调用接口的4种方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- Python数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:GadFlymSQL MySQL PostgreSQL Micros
- 主要实现功能1、用户输入用户名,在用户名文件中查找对应的用户,若无对应用户名则打印输入错误2、用户名输入正确后,进行密码匹配。输入密码正确则
- 本系列文章一直所没有触及的就是有关”还原(Restore)”的话题,因为一旦牵扯到这个话题就会涉及大量的误区,多到我无法通过一篇文章说完的地
- 本文实例为大家分享了python实现最大优先队列的具体代码,供大家参考,具体内容如下说明:为了增强可复用性,设计了两个类,Heap类和Pri
- 还是一个关于checkbox的一个普通的效果,就是根据你勾选的checkbox,列出你选择了哪些值演示代码:<!DOCTYPE htm
- <SPAN style="FONT-SIZE: 14px"><!DOCTYPE html> &l
- 本文实例讲述了Python爬虫实现网页信息抓取功能。分享给大家供大家参考,具体如下:首先实现关于网页解析、读取等操作我们要用到以下几个模块i
- 一、问题实现对文本的分句,大致来说主要是以中文的句号、感叹、问号等符号进行分句。难点在于直接分句可能会造成人物说话的语句也被分开!二、步骤分
- 本文实例讲述了Python实现的远程登录windows系统功能。分享给大家供大家参考,具体如下:首先安装wmi 命令:pip install
- 这些CSS Selector在平时写页面的时候用地不多,只在JavaScript库、Firefox插件、iPhone页面里有过接触。推荐大家
- Vue3中文文档Vue3.0对比Vue2.x优势框架内部做了大量的性能优化,包括:虚拟dom,编译模板,Proxy的新数据监听,更小的打包文