一、MySQL

1、Mysql的limit用法

在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
2、Mysql的分页查询语句的性能分析

MySql分页sql语句,如果和MSSQL的TOP语法相比,那么MySQL的LIMIT语法要显得优雅了许多。使用它来分页是再自然不过的事情了。

2.1 最基本的分页方式:
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...

在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引:
举例来说,如果实际SQL类似下面语句,那么在category_id, id两列上建立复合索引比较好:

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10
2.2 子查询的分页方式:

随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似:

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10

一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。
此时,我们可以通过子查询的方式来提高分页效率,大致如下:

SELECT * FROM articles WHERE  id >=   (SELECT id FROM articles  WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10
2.3 JOIN分页方式
SELECT * FROM `content` AS t1
JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;

经过我的测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。
explain SQL语句:

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY system NULL NULL NULL NULL 1
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where
2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index

为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。
实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。

二、Oracle

从数据库表中第M条记录开始检索N条记录

SELECT * FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum < M + N) t2 where t2.r >= M

例如从表Sys_option(主键为sys_id)中从第10条记录开始检索20条记录,语句如下:

SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2 where t2.R >= 10

三、SQLServer

SQL Server主要利用 SELECT TOP语句分页,具体方案,请参考

分页方案一:(利用Not In和SELECT TOP分页)

语句形式:

SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
分页方案二:(利用ID大于多少和SELECT TOP分页)

语句形式:

SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
分页方案三:(利用SQL的游标存储过程分页)
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
通过SQL 查询分析器,显示比较:我的结论是:

  • 分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
  • 分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
  • 分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

在实际情况中,要具体分析。


原文:https://www.cnblogs.com/cai170221/p/7122289.html

几种常用数据库分页查询相关推荐

  1. mysql 分页查询web_JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)...

    JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)-1.jpg (40.23 KB, 下载次数: 0) 2018-8-18 13:34 上传 在开发过程中,经常做的一件事,也是最基本的事 ...

  2. oracle数据库如何写翻页_ORACLE数据库分页查询/翻页 最佳实践

    ORACLE数据库分页查询/翻页 最佳实践 一.示例数据: Select Count(*) From dba_objects ; ----------------------------------- ...

  3. ORCALE数据库分页查询

    ORCALE数据库分页查询 ORCALE数据库实现分页查询可以使用row_number()函数或者使用rownum 虚列两种方法. 第一种:利用分析函数row_number() 方法 select * ...

  4. Mysql数据库分页查询及优化

    最近遇到个数据库分页查询问题,mysql数据库分页查询默认是升序查询,就是第一页查询的是最先插入的数据,最后一页才是最新插入的数据,弄了个小的数据库表单,记录下我的操作过程,还有优化查询速度的方法. ...

  5. 不同数据库分页查询的实现

    分页查询是数据库查询中经常用到的一项操作,对查询出来的结果进行分页查询可以方便浏览.那么Oracle.SQL Server.MySQL是如何实现查询的呢?本文我们就来介绍这一部分内容. 1. SQL ...

  6. (转)几种常用存储过程分页方法

    我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据 几种常用存储过程分页方法 TopN方法 select Top(@PageSize) from TableNam ...

  7. 几种常用数据库的区别

    几种常用数据库的区别 文章目录 几种常用数据库的区别 前言 一.开放性 二.可伸缩性,并行性 三.安全认证 四.性能 五.客户端支持及应用模式 六.操作上 七.使用风险 前言 本文讲了 MySQL. ...

  8. Sqlserver 数据库分页查询(三种方式)

    --第一种分页:sqlserver 2000-sqlserver2005 --假设:每页显示5条, 当前页:1  则查询1-5 --不等于前5条的前5条 select top 5 * from  St ...

  9. MySQL 数据库 分页查询/聚合查询

    引言 在本篇博客简单介绍一下分页查询以及聚合查询简单操作. 分页查询 在MySQL中,分页查询一般都是使用limit子句实现,limit子句声明如下: SELECT * FROM table LIMI ...

最新文章

  1. STM32固件库的安装与介绍
  2. 正则表达式笔记(谷歌分析自定义报告)
  3. Android开发8:UI组件TextView,EditText,Button
  4. java 返回js,Javascript返回上一页
  5. Android测试——在Python中如何将Windows程序前台显示
  6. 计算机网络工程专业面试,网络工程专业大学生面试自我介绍范文
  7. Python中Base64编码与解码
  8. 计算机应用基础图表填空,计算机应用基础试题
  9. c 游戏服务器提前生成一批账号,天涯明月刀第一批天涯合璧 数据互通公告
  10. 一些互联网标准化组织
  11. Cve-2016-7434一把梭
  12. Win11删除资源管理器中的图片、文档等文件夹
  13. htc legend 升级到 android 2.2 froyo 后,输入法问题
  14. 将wav音频文件转化为16k Hz 单通道的文件
  15. 瑞克斯平台国际时事汇总
  16. DATAKIT CrossManager 2022.4 Crack
  17. 无人机倾斜摄影和三维实景模型 实施流程
  18. 明星扎堆,王嘉儿,张艺兴,娜扎,赵丽颖,陈小春,应采儿 给您拜年啦!!!...
  19. Android端地图,百度地图学习(II)-Android端的定位
  20. Linux centos 关机重启命令

热门文章

  1. MySQL(71)MySQL删除视图(DORP VIEW)
  2. 教育系统+直播APP开发设计
  3. 震惊!!!excel竟然能当爬虫用!!!
  4. 农历2017年与2018年交接
  5. 什么是单页应用?它的优缺点?其缺点的解决方案是什么?
  6. WebFlux 客户端负载 - WebClient
  7. QBR意为:Quarter Business Review 翻译为:季度营运会议,季度业务审查
  8. Vue 项目部署到GitHub Pages
  9. 微擎开发小程序上应用市场(1)——头像框小程序
  10. 《Linux就该这么学》第十一节课学习笔记