MySQL中SQL分页查询的几种实现方法及优缺点

 更新时间:2020年07月15日 11:40:04   作者:十九画生  
这篇文章主要介绍了MySQL中SQL分页查询的几种实现方法及优缺点, 分页查询就是在满足条件的一堆有序数据中截取当前所需要展示的那部分。对此感兴趣的可以来了解一下

【SQL】SQL分页查询总结

开发过程中经常遇到分页的需求,今天在此总结一下吧。

简单说来方法有两种,一种在源上控制,一种在端上控制。源上控制把分页逻辑放在SQL层;端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridView)。显然,端上控制开发难度低,适于小规模数据,但数据量增大时性能和IO消耗无法接受;源上控制在性能和开发难度上较为平衡,适应大多数业务场景;除此之外,还可以根据客观情况(性能要求,源与端的资源占用等)在源和端之间加一层,应用特殊算法和技术进行处理。以下主要讨论源上,即SQL上的分页。

分页的问题其实就是在满足条件的一堆有序数据中截取当前所需要展示的那部分。实际上各种数据库都考虑到分页问题而内置了一些策略,比如MySql的LIMIT,Oracle的ROWNUM和ROW_NUMBER(),SqlServer的TOP和ROW_NUMBER(),基于此我们可以得到一系列分页的方法。

1、 基于MySql的LIMIT和Oracle的ROWNUM,可以直接限制返回区间(以MySql为例,注意使用Oracle的ROWNUM时要应用子查询):

方法一、直接限制返回区间

SELECT * FROM table WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小),页大小;

优点:写法简单。
缺点:当页码和页大小过大时,性能明显下降。
适用:数据量不大。

2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他们可以限制返回的行数,因此可以得到以下两套通用的方法(以SqlServer为例):

方法二、NOT IN

SELECT TOP 页大小 * FROM table WHERE 主键 NOT IN
(
 SELECT TOP (页码-1)*页大小 主键 FROM table WHERE 查询条件 ORDER BY 排序条件
)
ORDER BY 排序条件

优点:通用性强。
缺点:当数据量较大时向后翻页,NOT IN中的数据过大会影响性能。
适用:数据量不大。

方法三、MAX

SELECT TOP 页大小 * FROM table WHERE 查询条件 AND id >
(
 SELECT ISNULL(MAX(id),0) FROM 
 (
  SELECT TOP ((页码-1)*页大小) id FROM table WHERE 查询条件 ORDER BY id 
 ) AS tempTable
) 
ORDER BY id

优点:速度快,特别是当id为主键时。
缺点:适用面窄,要求排序条件单一且可比较。
适用:简单排序(特殊情况也可尝试转换成类似可比较值处理)。

3、基于SqlServer和Oracle的ROW_NUMBER(),可以得到返回数据的行号,基于此在限制返回区间得到如下方法(以SqlServer为例):

方法四、ROW_NUMBER()

SELECT TOP 页大小 * FROM 
(
 SELECT TOP (页码*页大小) ROW_NUMBER() OVER (ORDER BY 排序条件) AS RowNum, * FROM table WHERE 查询条件
) AS tempTable
WHERE RowNum BETWEEN (页码-1)*页大小+1 AND 页码*页大小
ORDER BY RowNum

优点:在数据量较大时相比NOT IN有优势。
缺点:小数据量时不如NOT IN。
适用:大部分分页查询需求。

以上是自己总结的拙见,性能比较来自网上资料及个人判断,并没有深入实验,不当之处请大家指正。

到此这篇关于MySQL中分页查询的几种实现方法及优缺点的文章就介绍到这了,更多相关MySQL中分页查询的方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家

相关文章

  • mysql跨服务查询之FEDERATED存储引擎的实现

    mysql跨服务查询之FEDERATED存储引擎的实现

    本文主要介绍了mysql跨服务查询之FEDERATED存储引擎的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • mysql的MVCC多版本并发控制的实现

    mysql的MVCC多版本并发控制的实现

    这篇文章主要介绍了mysql的MVCC多版本并发控制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 数据库性能测试之sysbench工具的安装与用法详解

    数据库性能测试之sysbench工具的安装与用法详解

    sysbench是一个很不错的数据库性能测试工具,这篇文章主要给大家介绍了关于数据库性能测试之sysbench工具的安装与用法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • MySQL表内连和外连的具体使用

    MySQL表内连和外连的具体使用

    我们在使用MySQL的时候,经常涉及到内连接和外连接的应用,本文就来详细的介绍一下MySQL表内连和外连的具体使用,感兴趣的可以了解一下
    2023-10-10
  • MySQL示例DTID主从原理解析

    MySQL示例DTID主从原理解析

    这篇文章主要介绍了MySQL示例DTID主从原理解析,其实包含了详细的使用方法说明,有需要的朋友可以借鉴参考下,希望可以有所帮助,感谢阅读
    2021-09-09
  • MySQL8.0修改Root密码的方法步骤

    MySQL8.0修改Root密码的方法步骤

    MySQL在初次安装之后默认设置了root用户的密码,对于一些情况下需要修改root用户密码的操作,本文主要介绍了MySQL8.0修改Root密码的方法步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • k8s搭建mysql集群实现主从复制的方法步骤

    k8s搭建mysql集群实现主从复制的方法步骤

    本文是基于已有k8s环境下,介绍在k8s环境中部署mysql主从集群的实现步骤,对mysql学习有一定的帮助,感兴趣的可以学习一下
    2023-01-01
  • linux mysql 安装与操作

    linux mysql 安装与操作

    mysql是linux平台下最流行的数据库系统,今天介绍的是mysql的安装及简单的操作方法!
    2009-06-06
  • 在MySQL中如何存取List<String>数据

    在MySQL中如何存取List<String>数据

    这篇文章主要介绍了在MySQL中如何存取List<String>数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • MySQL的23个需要注意的地方

    MySQL的23个需要注意的地方

    本文将为大家介绍的是MySQL数据库的23个特别注意事项,希望各位DBA能从中得到一些启发。
    2010-08-08

最新评论