小工具      在线工具  汉语词典  css  js  c++  java

MySQL中ORDER BY与LIMIT一起使用(有坑)

Java 额外说明

收录于:93天前

一、现象与问题

通过ORDER BY排序后,使用LIMIT获取前几项,发现返回的结果集的顺序与预期不一样。

这是我遇到的问题:

可以看到,有LIMIT和没有LIMIT的结果和我预想的不一样,令人“难以置信”。实在令人费解。

后来百度了一下,发现如果order by columns的值相同,mysql会随机选择这些行。为了保证每次返回的顺序一致,可以额外添加一个排序字段(如:id),使用两个字段。可以减少重复的概率

所以,改成order by status,id;

虽然问题已经解决了,但是我们还是看看官方文档是怎么说的吧!

2. LIMIT查询优化

——摘自《LIMIT查询优化》

如果您只需要结果集中特定数量的行,请在查询中使用 LIMIT 子句,而不是获取整个结果集并丢弃不需要的剩余数据。

MySQL 有时会优化包含 LIMIT 子句但不包含 HAVING 子句的查询:

  • MySQL通常更喜欢执行全表扫描,但是如果使用LIMIT只查询几行,MySQL在某些情况下可能会使用索引。
  • 如果你将LIMIT 行数子句与ORDER BY子句组合在一起使用的话,MySQL会在找到排序结果的第一个行数行后立即停止排序,而不是对整个结果进行排序。如果使用索引来完成排序,这将非常快。如果必须执行文件排序,则在找到第一个行数行之前,选择所有与查询匹配但不包括LIMIT子句的行,并对其中大部分或所有行进行排序。一旦找到第一个行数之后,MySQL不会对结果集的任何剩余部分进行排序。这种行为的一种表现形式是,一个ORDER BY查询带或者不带LIMIT可能返回行的顺序是不一样的。
  • 如果LIMIT 行数与DISTINCT一起使用,一旦找到行数惟一的行,MySQL就会停止。
  • LIMIT 0 可以快速返回一个空结果集,这是测试查询是否有效的有用方法。
  • 如果服务器使用临时表来解析查询,它将使用LIMIT 行数子句来计算需要多少空间。
  • 如果 ORDER BY 不使用索引并且后跟 LIMIT,则优化器可能能够避免使用合并文件并使用内存中文件排序操作对内存中的行进行排序。

如果 ORDER BY 列有多行具有相同的值,则服务器可以按任意顺序返回这些行,并且可能根据整体执行计划以不同的方式返回这些行。换句话说,这些行的排序顺序对于未排序是未定义的。

影响执行计划的因素之一是 LIMIT,因此对于 ORDER BY 查询,带 LIMIT 和不带 LIMIT 返回的行顺序可能不同。

看下面的例子:

包含 LIMIT 可能会影响每个类别行的顺序。例如:

如果您需要确保在有或没有 LIMIT 的情况下以相同的顺序返回项目,那么您可以在 ORDER BY 中包含其他列以使顺序具有​​确定性。例如:

三、总结

1、如果只需要结果集中的某些行,建议使用limit。这样,您就可以避免抓取整个结果集,然后丢弃不需要的行。

2. 对于 order by 查询,返回的行顺序可能不同,有限制也可能没有限制。

3、如果limit 行数 与 order by 一起使用,那么在找到第一个行数就停止排序,直接返回。

4.如果order by列具有相同的值,MySQL可以自由地以任何顺序返回行。也就是说,只要order by列中的值不重复,就可以保证返回的顺序。

5. 您可以在 order by 子句中包含其他列以使顺序具有​​确定性。

4. 文档

https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

https://dev.mysql.com/doc/refman/5.7/en/

https://dev.mysql.com/doc/

. . .

相关推荐

额外说明

JSON解析错误:无法从字符串2023-02-19 00:00:00反序列化“java.util.Date”类型的值

问题描述:正常post请求然后接日期参数的时候报的异常 解决方案:添加 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat是用来格式化parm

额外说明

将本地包pom引入maven jar包的两种方式

项目中有些jar包是第三方的,maven官方仓库没有, 需要使用mvn install命令打包到本地,然后将其写入到pom.xml的依赖中, maven仓库有的jar包则从maven官网找到对应版本的depdency写入pom文件里面,这样maven打包

额外说明

Autodesk官方卸载工具软件安装教程

Autodesk卸载工具是一个专门用于Autodesk软件的卸载工具,可以自动识别电脑中的所有Autodesk软件,只需一键点击就能将Autodesk的软件完美卸载,并且不保留任何痕迹,这款卸载工具就可以帮助用户全面卸载Autodesk软件。 目录 一、

额外说明

xml mysql 强制走区分大小写查询

场景 因大写,小写都查询出了结果,导致业务逻辑出错 解决 怎么SQL直接让查询时区分出大小写 加关键字: binary  <select id="getByName" resultType="cn.entity.XXX"> sel

额外说明

A bean with that name has already been defined and overriding is disabled: Feign远程调用出现的错误

目录 错误一: 只能放到interface接口上 看下面过程: 错误二: 标题所示, bean注入冲突了 原因: 解决办法: 错误一: @FeignClient()注解 只能放到interface接口上 看下面过程: 加 @EnableFeignClei

额外说明

beego框架orm中使用原生sql

一、使用Exec操作 注意Exec()函数只能执行添、删、改操作,不能进行查询操作 1、插入数据 o := orm.NewOrm() res, err := o.Raw(`insert into user values(id,?,?,?)`, "欧阳锋"

额外说明

8. 发布确认高级

在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败, 导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢? 特别是在这样比较极端的情况,Rabb

额外说明

Spring Boot 介绍

Spring Boot通常用于开发各种类型的Java应用程序,特别是企业级应用程序和微服务。它提供了一种快速、简单且可扩展的方式来构建独立的、生产就绪的应用程序。下面是一些常见的应用程序类型,可以使用Spring Boot进行开发: 1. Web应用程序

额外说明

CSS实现列表滚动效果

效果: 应用场景:  1. 一个竖向列表(或横向列表)中有很多行,但是随着页面上下(或左右)滑动,整个列表会随之移动。 2.三级联动菜单,上下滑动的时候。 诸如此类... 在这里介绍一个css属性,overflow-y和overflow-x 以以下代码为

额外说明

解决因缺少MSVBVM50.DLL无法启动问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个MSVBVM50.DLL文件进行安装(前提是找到适合的版本),

ads via 小工具