概述

昨天介绍了Oracle分页实现方案,那么,mysql又是如何实现分页呢?

参考官网:https://dev.mysql.com/doc/refman/5.7/en/select.html


mysql分页实现

MySQL中实现分页查询:在数据量较小的情况下可使用limit查询来实现分页查询,在数据量大的情况下使用建立主键或唯一索引来实现,另外可通过order by对其排序。

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants, with these exceptions:

  • Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.
  • Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables.

1、limit分页实现

先看一下limit语法

SELECT * FROM TABLE    [ORDER BY {col_name | expr | position}      [ASC | DESC], ... [WITH ROLLUP]]    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。

1.1、传统实现方式

一般情况下,客户端通过传递 pageNo(页码)、pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小(元组百/千级)时使用 MySQL自带的 limit 来解决这个问题

--pageNo:页码--pagesize:每页显示的条数select * from table limit (pageNo-1)*pageSize,pageSize;

1.2、建立主键或者唯一索引(高效)

在数据量较小的时候简单的使用 limit 进行数据分页在性能上面不会有明显的缓慢,但是数据量达到了 万级到百万级 sql语句的性能将会影响数据的返回。这时需要利用主键或者唯一索引进行数据分页;

--pageNo:页码--pagesize:每页显示的条数--假设主键或者唯一索引为 t_idselect * from table where t_id > (pageNo-1)*pageSize limit pageSize; 

1.3、基于数据再排序

当需要返回的信息为顺序或者倒序时,对上面的语句基于数据再排序。order by ASC/DESC 顺序或倒序 默认为顺序

 select * from table where t_id > (pageNo-1)*pageSize order by t_id limit pageSize; 

2、查询显示行号(实现类似Oracle数据库的ROWNUM())

Oracle中有专门的rownum()显示行号的函数,而MySQL没有专门的显示行号函数,但可以通过用@rownum自定义变量显示行号。

一般实现过程如下:

SELECT   (@rownum := @rownum + 1) AS rownum,  t.* FROM  table t,  (SELECT @rownum := 0) AS rn

3、实例演示

3.1、环境准备

CREATE TABLE t (EMPNO BIGINT ( 4 ) NOT NULL,ENAME VARCHAR ( 10 ),JOB VARCHAR ( 9 ),MGR BIGINT ( 4 ),HIREDATE date,SAL BIGINT ( 10 ),COMM BIGINT ( 10 ),DEPTNO BIGINT ( 2 ),PRIMARY KEY ( `EMPNO` ) ) ENGINE = INNODB;INSERT INTO t VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800', NULL, '20');INSERT INTO t VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30');INSERT INTO t VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30');INSERT INTO t VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', NULL, '20');INSERT INTO t VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30');INSERT INTO t VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', NULL, '30');INSERT INTO t VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450', NULL, '10');INSERT INTO t VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000', NULL, '20');INSERT INTO t VALUES ('7839', 'KING', 'PRESIDENT', NULL, '1981-11-17', '5000', NULL, '10');INSERT INTO t VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500', '0', '30');INSERT INTO t VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100', NULL, '20');INSERT INTO t VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', NULL, '30');INSERT INTO t VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', NULL, '20');INSERT INTO t VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', NULL, '10');commit;

3.2、limit分页

--查询第一页,每页显示5条数据select * from t order by empno desc limit (1-1)*5,5;--查询第二页,每页显示4条数据select * from t order by empno desc limit (2-1)*4,4; 

3.3、查询显示行号

--查询第二页,每页显示4条数据,并在第一列加上行号select (@rownum := @rownum + 1) AS rownum,t.* from t,  (SELECT @rownum := 0) AS rn order by t.empno desc limit 4,4; 

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

datagrid分页传递参数_四类数据库分页实现方案总结之Mysql分页实现相关推荐

  1. sqlserver 分页_四类数据库分页实现方案总结之PG分页实现

    概述 前面介绍了Oracle.mysql.sqlserver的分页实现方案了,所以今天主要介绍一下关于PG的分页实现.传统的精准分页(能获取到总页数并且任意跳转页码)在需要符合条件的记录总数目,不过p ...

  2. oracle 去重_超详细的四类数据库去重实现方案汇总,值得收藏

    概述 今天主要闲聊Oracle.MySQL.sqlserver.pg数据库在删除重复数据时是怎么实现的,仅供参考. 一.Oracle数据库去重 1.环境准备 可以看到"ALLEN" ...

  3. mysql 去重 根据id_超详细的四类数据库去重实现方案汇总,值得收藏

    概述 今天主要闲聊Oracle.MySQL.sqlserver.pg数据库在删除重复数据时是怎么实现的,仅供参考. 一.Oracle数据库去重 1.环境准备 可以看到"ALLEN" ...

  4. 从对话框中传递参数到视图类

    原文地址:从对话框中传递参数到视图类作者:多彩 这个看似简单的问题确实让我郁闷了好几天,但想出来居然只用了一分钟不到.看来还是很有纪念价值的. 假设在视图类的一个需要传递参数的函数中定义对话框的对象 ...

  5. php list 传递 assign('list'_,thinkphp5分页传递参数

    按照惯例先描述问题: 需求分析:在后台管理文章的时候添加文章搜索,然后搜索出来的数据如果大,需要分页.这个时候就涉及到带参数分页. 分页类的便捷用法: 1,没有参数的时候直接 paginate 具体用 ...

  6. python类方法需要传入cls参数_如何从Python 3.x中的类定义传递参数到元类?

    这是如何从类定义向元类传递参数的python 3.x版本?问题,根据请求单独列出,因为答案与python 2.x明显不同. 在python 3.x中,如何将参数传递给元类的__prepare__.__ ...

  7. springboot 分页查询参数_精通SpringBoot--分页查询功能的实现

    本文将介绍如何实现分页查询功能,推荐使用github的pagehelper插件实现(事实上大家基本都是这么干的),但本文的实现方式和大多数不同,废话少说,现在就带着大家看看区别在哪里. 先看pom.x ...

  8. angular路由传递参数_@medux 路由篇

    欢迎您开始@medux 之旅,建议您依次阅读以下 4 篇文章,这将耗费您大约 30 分钟. 为什么你需要 @medux @medux 基础概念速览 @medux 路由篇 @medux 数据流 第 3 ...

  9. mysql数据库建模方式_SQL Server中的四类数据库建模的方法介绍

    SQL Server四类数据仓库建模的方法主要分为以下四类. 第一类是关系数据库的三范式建模,通常我们将三范式建模方法用于建立各种操作型数据库系统. 第二类是Inmon提倡的三范式数据仓库建模,它和操 ...

最新文章

  1. 工作流引擎在视频网站架构中的应用
  2. 一次非常有意思的sql优化经历
  3. 读书笔记《单核工作法》_6:颠倒you'xian'ji
  4. [转载] 民兵葛二蛋——第1集
  5. Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现
  6. BugkuCTF-WEB题本地管理员
  7. 元宇宙时代,技术长什么样
  8. JavaSelenium处理页面Table以及Table中随机位置的数据
  9. Webpack实战(二):基础配置入门 - webpack-dev-server的介绍与用法
  10. 带有页脚聚合的WPF数据网格
  11. 做自媒体也要注意“轻资产”
  12. SpringBoot实战(五):配置健康检查与监控
  13. GRAPH ATTENTION NETWORKS 学习翻译
  14. linux中swap的权限,有关 Linux Swap
  15. Leetcode第904题
  16. WINVNC分析(一)——源码执行流程
  17. 【蓝牙开发】低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
  18. idea 如何将本地新建项目上传到gitlab
  19. power BI 中x轴日期值显示英文改为数值形式
  20. 避免踩踏悲剧|AI赋能城市应急,让智慧景区更安全

热门文章

  1. 虚拟机下Linux安装图解之一:VMware Workstation的安装
  2. go的异常处理,defer,panic,recover
  3. 关于监控拾音器测试对比的一些小建议
  4. 计算字符串和文件的MD5值
  5. Oracle 12c coming soon?
  6. 14.3.1 调用系统的拍照功能
  7. [扫盲] Salesforce.com: 业界云计算(Cloud Computing)的主要倡导者之一
  8. 情感分析——深入snownlp原理和实践
  9. java诡异的String.split()方法
  10. redis学习之常用数据类型