MySQL分页查询--LIMIT、OFFSET

2024-08-24 16:12

本文主要是介绍MySQL分页查询--LIMIT、OFFSET,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

limit简介

LIMIT 是 MySQL 中的一个特殊关键字,用于指定查询结果从哪条记录开始显示,一共显示多少条记录。

LIMIT 关键字有两种使用方式,即指定初始位置、与 OFFSET 组合使用

用法一:获取结果集的特定部分

limit中文可翻译为限制、界限,在MySQL中,limit可以用来获取结果集的特定部分,即结果集的起始位置往下查询的行数。

例如想要查询表中的前5条数据就可以使用下面的语句:

SELECT * FROM `user` LIMIT 5;

查询结果如下:

在这里插入图片描述

用法二:分页查询

limit可以和offset结合实现分页查询,例如查询从第四条数据开始往下的三条数据:

SELECT * FROM `user` LIMIT 3 OFFSET 3;

可以通过调整limit和offset的值来控制查询数据的页数和每页查询的条数

SELECT * FROM `user` LIMIT (PageSize) OFFSET (Page * PageSize)

其中PageSize代表每页需要的数据条数,Page代表要查询的是第几页(默认从第0页开始)

注意

  • LIMIT n 表示每页显示n条数据,OFFSET n 表示从第n+1条数据开始显示
  • OFFSET不能单独使用,如果没有使用LIMIT,那么OFFSET将没有意义,因为没有指定返回记录的数量限制
  • SQL语句中LIMIT 要放在 OFFSET前面,LIMIT和OFFSET要放在整个SQL语句的最末尾

会出现的问题–深分页

问题描述

深分页指的是翻页请求中的页码数非常大,OFFSET数值非常大的情况。如果直接使用LIMIT offset/ limit的方式进行分页,那么在OFFSET超过10000时,性能会明显下降。

原因

延迟增加

原因是LIMIT语句会先获取符合条件的offset+n行数据,然后再丢弃掉前offset行,返回后n行数据。也就是说limit 10000,10,就会扫描100010行,而limit 0,10,只扫描10行。这里需要回表10010次,大量的时间都在回表这个上面。

内存消耗

MySQL需要将整个结果集加载到内存中进行排序和筛选,如果结果集很大,可能会导致内存不足的问题。

磁盘IO

如果结果集无法完全放入内存中,MySQL可能会将部分数据写入临时文件进行排序和筛选,这会增加磁盘IO的负载。

解决方法

优化的重点就在减少回表上,采用的方法是子查询+覆盖索引;例如:

select * from users where status ='1' order by id limit 10000, 10;

使用子查询的方法,将条件语句(包括where,order by,limit,offset等)抽出来放到子查询语句中,查找符合条件的该表中对应数据的唯一索引字段,作为一个单独的中间表,再将该表与原总表进行连表查询,这样在筛选时就不需要从所有满足条件的数据中进行淘汰了

可以将上面的语句修改为:

select u.*
from users as u, (select u.idfrom users as u where u.status = '1' order by u.id limit 10 offset 10000) as middle_table
where u.id = middle_table.id

这篇关于MySQL分页查询--LIMIT、OFFSET的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102961

相关文章

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec