【mySQL】mysql数据库分页查询讨论专题

2023-05-16

目录

一、limit分页公式、总页数公式

1 limit分页公式

2 总页数公式

二 、Mysql的三种分页方法

1 limit m,n分页语句(低效)

2 limit m语句 (有局限)

三、 查询优化

1 使用子查询优化

2 使用 id 限定优化(前提:id是连续递增,删除过记录不符合)

3 使用临时表优化

四、关于数据表的id说明

五、欢迎大家提出错误和新方案


作者:bandaoyu 本文随时更新,地址:https://blog.csdn.net/bandaoyu/article/details/89844673

一、limit分页公式、总页数公式


1 limit分页公式


(1)limit分页公式:curPage是当前第几页;pageSize是一页多少条记录

limit  (curPage-1)*pageSize,pageSize

(2)用的地方:sql语句中

select * from student limit(curPage-1)*pageSize,pageSize;

2 总页数公式


(1)总页数公式:totalRecord是总记录数;pageSize是一页分多少条记录

int totalPageNum = (totalRecord +pageSize - 1) / pageSize;

(2)用的地方:前台UI分页插件显示分页码
(3)查询总条数:totalRecord是总记录数,SELECT COUNT(*) FROM tablename


二 、Mysql的三种分页方法

1 limit m,n分页语句(低效)

select * from dept order by deptno desc limit 3,3;
select * from dept order by deptno desc limit m,n;

limit 3,3的意思扫描满足条件的3+3行,撇去前面的3行,返回最后的3行,那么问题来了,如果是limit 200000,200,需要扫描200200行,如果在一个高并发的应用里,每次查询需要扫描超过20W行,效率十分低下。

测试见:https://www.cnblogs.com/youyoui/p/7851007.html

例如:

select * from orders_history where type=8 limit 100,100;
select * from orders_history where type=8 limit 1000,100;
select * from orders_history where type=8 limit 10000,100;
select * from orders_history where type=8 limit 100000,100;
select * from orders_history where type=8 limit 1000000,100;

耗时分别如下:

  • 查询100偏移:        25ms 
  • 查询1000偏移:      77ms 
  • 查询10000偏移:    3128ms
  • 查询100000偏移:  3812ms
  • 查询1000000偏移:14608ms

2 limit m语句 (有局限)

 select * from dept where deptno >10 order by deptno asc limit n;//下一页
 select * from dept where deptno <60 order by deptno desc limit n//上一页

这种方式不管翻多少页只需要扫描n条数据。

但是,虽然扫描的数据量少了,但是在某些需要跳转到多少页的时候就无法实现,这时还是需要用到方法1,既然不能避免,那么我们可以考虑尽量减小m的值,因此我们可以给这条语句加上一个条件限制。使得每次扫描不用从第一条开始。这样就能尽量减少扫描的数据量。

例如:每页10条数据,当前是第10页,当前条目ID的最大值是109,最小值是100.(当前100-109)
那么跳到第9页:

select * from dept where deptno<100 order by deptno desc limit 0,10;   //倒序

那么跳到第8页:

select * from dept where deptno<100 order by deptno desc limit 10,10;

那么跳到第11页:

select * from dept where deptno>109 order by deptno asc limit 0,10;


最后附上参考文档网址:http://www.open-open.com/doc/view/2bda32bf64864e8e965e91686f5309d4
原文:https://blog.csdn.net/HADEWOKE/article/details/53996110

注意:这个方法有个局限,就是需要deptno是连续的,也就是中间的记录不能有删除。(可以用删除标志代替真正的物理删除)

上面的方法还可以优化,见第三。

三、 查询优化

子查询优化原理:一次SQL查询优化原理分析(900W+数据,从17s到300ms) - 知乎

1 使用子查询优化

这种方式先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况。

select * from orders_history where type=8 limit 100000,1;
select id from orders_history where type=8 limit 100000,1;

select * from orders_history where type=8 and 
id>=(select id from orders_history where type=8 limit 100000,1) 
limit 100;

select * from orders_history where type=8 limit 100000,100;

4条语句的查询时间如下:

  • 第1条语句:3674ms
  • 第2条语句:1315ms
  • 第3条语句:1327ms
  • 第4条语句:3710ms

针对上面的查询需要注意:

  • 比较第1条语句和第2条语句:使用 select id 代替 select * 速度增加了3倍
  • 比较第2条语句和第3条语句:速度相差几十毫秒
  • 比较第3条语句和第4条语句:得益于 select id 速度增加,第3条语句查询速度增加了3倍

这种方式相较于原始一般的查询方法,将会增快数倍。

2 使用 id 限定优化(前提:id是连续递增,删除过记录不符合)

这种方式假设数据表的id是连续递增的,则我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:

select * from orders_history where type=2 
and id between 1000000 and 1000100 limit 100;

查询时间:15ms 12ms 9ms

这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。限制是只能使用于明确知道id的情况,不过一般建立表的时候,都会添加基本的id字段,这为分页查询带来很多便利。

还可以有另外一种写法:

select * from orders_history where id >= 1000001 limit 100;

当然还可以使用 in 的方式来进行查询,这种方式经常用在多表关联的时候进行查询,使用其他表查询的id集合,来进行查询:

select * from orders_history where id in
(select order_id from trade_2 where goods = 'pen')
limit 100;

这种 in 查询的方式要注意:某些 mysql 版本不支持在 in 子句中使用 limit。

3 使用临时表优化

这种方式已经不属于查询优化,这儿附带提一下。

对于使用 id 限定优化中的问题,需要 id 是连续递增的,但是在一些场景下,比如使用历史表的时候,或者出现过数据缺失问题时,可以考虑使用临时存储的表来记录分页的id,使用分页的id来进行 in 查询。这样能够极大的提高传统的分页查询速度,尤其是数据量上千万的时候。

四、关于数据表的id说明

一般情况下,在数据库中建立表的时候,强制为每一张表添加 id 递增字段,这样方便查询。

如果像是订单库等数据量非常庞大,一般会进行分库分表。这个时候不建议使用数据库的 id 作为唯一标识,而应该使用分布式的高并发唯一 id 生成器来生成,并在数据表中使用另外的字段来存储这个唯一标识。

使用先使用范围查询定位 id (或者索引),然后再使用索引进行定位数据,能够提高好几倍查询速度。即先 select id,然后再 select *;

MySQL分页查询优化 - 悠悠i - 博客园

五、欢迎大家提出错误和新方案

欢迎大家指出错误、隐患、缺陷或提出补充、更好的方案,相互探讨。

@UESTC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【mySQL】mysql数据库分页查询讨论专题 的相关文章

  • 外键和索引

    我有 2 张桌子 products and 类别 每个类别有很多产品 一个产品可以属于多个类别 products product id int primary auto increment name unique etc 类别 catego
  • 删除表的重复项

    In my activity logs 它包含列 material name user id mod result 这标志着测试是否通过 失败 cert links 不知何故 用户生成了两倍的条目material name与cert lin
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • 如何在 codeigniter 查询中使用 FIND_IN_SET?

    array array classesID gt 6 this gt db gt select gt from this gt table name gt where array gt order by this gt order by q
  • Hibernate + MySQL + rewriteBatchedStatements=true

    我有以下 Hibernate 配置
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 无法连接到 Node.js 上的 MySQL 数据库

    我仍然不明白为什么在尝试连接到 Node js 上的 MYSQL Server 时仍然收到此错误消息 ERROR Error ER ACCESS DENIED ERROR Access denied for user root localh
  • 如何使用wireshark清晰捕获mysql查询sql

    因为我们使用远程开发Mysql服务器 所以不能轻易检查查询sql 如果使用本地服务器可以tail f general log file查看调用某个http接口时执行了哪些sql 所以我安装了一个wireshark捕获这些从本地发送的查询sq
  • 无法在 .net core 2 中从 MySQL 构建“日期”类型列

    我已经开始了一个新的 net core 2 项目 我正在尝试将 MySQL 数据库导入实体框架 我使用此命令来搭建数据库 Scaffold DbContext server localhost port 3306 user id user
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • MySQL 左连接 WHERE table2.field = "X"

    我有以下表格 pages Field Type Null Key Default Extra page id int 11 NO PRI NULL auto increment type varchar 20 NO NULL
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • MySql 视图脚本中的注释

    可以这样做吗 我尝试过多个 gui mysql workbench navicat toad for mysql 但没有一个保存这样的注释 something important select something else importan
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in

随机推荐

  • 详解STL---vector

    目录 1 vector的介绍及应用 1 1vector的介绍 1 2vector的使用 1 2 1 vector的定义 1 2 2 vector iterator 的使用 1 2 3 vector 空间增长问题 1 2 4 vector 的
  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    一 委托 Delegate 1 委托 Delegate 简介 最近天气晴雨不定 你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去 于是你委托好友小明在天气发生变化时打电话通知你 这就是一种委托 下面是这种委托的实例代码 定义一个
  • 学习OpenMV(一)详细参数及简单介绍

    目录 一 Open MV 简介 1 OpenMV摄像头的特点 xff1a 2 OpenMV摄像头的应用 xff1a 3 规格 xff1a 二 搭建环境 xff0c Open MV IDE安装 1 Windows系统 2 Linux系统 三
  • IEEE trans on cybernetic被拒后可以和主编argue争取下吗

    IEEE trans on cybernetic xff1a 一审两个人审稿人 xff0c 主编的决定是reject amp resubmit 二审又增加了一个审稿人 xff0c 前两个审稿人都同意发表的情况下 xff0c 新加的审稿人提了
  • 获取IntelRealSense d435i 相机内参

    获取IntelRealSense d435i 相机内参 摘要实现 摘要 本文提供了一种获取IntelRealSense d435i相机内参的方法 实现 span class token macro property span class t
  • 用Clion代替keil对CubeMX生成代码进行编写的基础准备

    网上教程比较多 首先需要安装CubeMX Clion 以及相关的依赖 xff0c 不一一赘述 xff0c 可以参考以下链接 CLion xff1a 安装 搭建 配置 插件 忘尘 丶莫负的博客 CSDN博客 clion安装插件 在确认搭建好环
  • Ubuntu下如何创建工作空间(详细)

    Ubuntu下工作空间的创建方法 xff1a xff08 1 xff09 mkdir p catkin ws src 创建工作空间catkin ws和子目录src xff0c 自定义空间名 cd catkin ws 进入到工作空间catki
  • Turtlebot移动机器人gazebo仿真及自动导航(详细级)

    目的 在仿真环境中控制Turtlebot3 Burger运动 slam和自动导航 环境 xff1a 双系统下ROS为noetic xff08 其他版本的ROS注意在下载软件包时改成自己的ROS xff09 步骤 xff1a xff08 1
  • 【linux】linux中fork()详解(实例讲解)|fork的运行机制

    目录 linux中fork xff08 xff09 函数详解 从一道面试题谈linux下fork的运行机制 linux中fork xff08 xff09 函数详解 原文 xff1a linux中fork xff08 xff09 函数详解 x
  • 当面试官问你Promise的时候,他究竟想听到什么?

    1 什么是Promise xff1f Promise是异步操作的一种解决方案 2 为什么要使用Promise xff1f Promise能很好的解决层层嵌套的回调函数 xff0c 即回调地狱 callback hell 的问题 3 什么是回
  • win10安装Ubuntu16.04

    第一次安装双系统 xff0c 踩了不少坑 xff0c 花了两三天才装好 xff0c 因为电脑的不同 xff08 本人电脑联想小新i5 xff09 xff0c 网上那些安装过程有些不适用 xff0c 所以花了好长时间 xff0c 甚至差点决定
  • 12道C++经典笔试题及答案(2022)

    目录 一 题目 二 题目以及答案 一 题目 1 C和C 43 43 中的struct有什么区别 2 C 43 43 中的struct和class有什么区别 xff1f 3 如何判断一段程序是由C编译程序还是由C 43 43 编译程序的 xf
  • Java开发者出路在哪?牛皮轰轰

    正文 先问小伙伴们一个问题 xff0c 登录难吗 xff1f 登录有什么难得 xff1f 输入用户名和密码 xff0c 后台检索出来 xff0c 校验一下不就行了 凡是这样回答的小伙伴 xff0c 你明显就是产品思维 xff0c 登录看似简
  • 我阿里P7了解到的Android面试的一些小内幕!已拿offer

    前言 这些题目是网友去百度 小米 乐视 美团 58 猎豹 360 新浪 搜狐等一线互联网公司面试被问到的题目 熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率 欢迎一线公司员工以及网友提交面试题库 xff0c 欢迎留言 网上的都是按
  • Autoware激光雷达建图流程

    首先导入录制的包 点击 Play 按钮播放数据 xff0c 然后再点击 Pause 暂停播放 设置从base link到velodyne坐标系的TF 在 Baselink to Localizer 中设置好各个参数之后点击 TF 按钮 xf
  • Xshell连接不上虚拟机的解决办法

    目录 一 xff0c 首先检查对应的会话信息是否正确 二 xff0c 检查网络配置 三 xff0c 防火墙是否关闭 四 xff0c ssh服务是否开启 五 xff1a 更改网关 一 xff0c 首先检查对应的会话信息是否正确 xff08 1
  • 如何介绍简历中的项目呢?请看软件测试老师的分享

    项目经验与工作经验是相辅相成的 xff0c 但较之于工作经验 xff0c 项目经验更侧重于表现求职者在某个专业领域内的技能水平 xff08 技能水平决定了工资水平 xff09 因而 xff0c 技术类岗招聘的时候 xff0c 更注重项目经验
  • 正点原子飞控——代码学习笔记(一)

    手柄代码篇 我们直接看代码部分 xff0c 然后逐步深入了解 xff0c 如有不对的地方 xff0c 欢迎大家指证 xff01 xff01 第一阶段 设备内部的初始化 一 中断配置初始化 span class token macro pro
  • Ros安装

    前提 xff1a 若要安装ros xff0c 首先需要配置Ubuntu系统允许restricted xff08 不完全的自由软件 xff09 universe xff08 Ubuntu官方不提供支持和补丁 xff0c 全靠社区支持 xff0
  • 【mySQL】mysql数据库分页查询讨论专题

    目录 一 limit分页公式 总页数公式 1 limit分页公式 2 总页数公式 二 Mysql的三种分页方法 1 limit m n分页语句 xff08 低效 xff09 2 limit m语句 xff08 有局限 xff09 三 查询优