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

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

Java 额外说明

收录于:42天前

一、现象与问题

通过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/

. . .

相关推荐

额外说明

突破边界:文本检测算法的革新与应用前景

突破边界:文本检测算法的革新与应用前景 1.文本检测理论篇(文本检测方法介绍) 文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要解决目标分类问题。 文本在图像中的表现形式可以视为一种‘目标‘,通用的目标检测的

额外说明

JAVA实战——视频管理系统&& tomcat虚拟目录配置与音乐播放

QQ 1285575001 Wechat M010527 技术交流 QQ群599020441 纪年科技aming

额外说明

day13_tomcat

今日内容 web相关概念回顾 web服务器软件:Tomcat Servlet入门学习 web相关概念回顾 软件架构 C/S:客户端/服务器端 B/S:浏览器/服务器端 资源分类 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源。静态资源可以直

额外说明

【小吉送书—第二期】阿里后端开发:抽象建模经典案例

文章目录 0.引言 1.抽象思维 2.软件世界中的抽象 2.1 命名抽象 2.2 分层抽象 2.3 原则抽象 3. 经典抽象案例 3.1 方案一:战术抽象,多快好省,跑步前进 3.2 方案二:深入分析,透过表象,探寻本质 5. 推荐一本书 -彩蛋 0.引

额外说明

分布式锁使用场景以及实现方式

目录 1.分布式锁的使用场景 2.分布式锁的常用实现方式 2.1 基于Zookeeper实现 2.2 基于Redis/MySql实现 2.3 用串行化代替分布式锁 2.3.1 异步串行化 2.3.2 同步串行化 1.分布式锁的使用场景 场景:单机多个线程

额外说明

JS, CSS 文件压缩与反压缩工具

JS, CSS 压缩可以去掉文件中的多余字符, 减少文件大小, 减少网络传输时间。 但是, 压缩之后就没有可读性了。 比较适合一些很稳定,较少改动和共用性很高的文件。 目前存在的可以压缩的工具很多,也有不少在线的。 YUICOMPRESSOR是一个不错的

额外说明

Spring事务机制详解

写这篇博客之前我首先读了《Spring in action》,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spr

额外说明

如何判断2条线段是否相交(编程实现)?

我们在编程中有时可能会碰到一些问题,比如怎么判断2条线段是否相交,最常规的一种思路可能就是解方程,看是否有交点,但这种方法用代码实现感觉稍显复杂,时间复杂度大,且控制条件多,很容易出错,那我们有没有更简单的方法呢? 我们在大约高中的时候应该都学过向量的叉

额外说明

【eclipse】eclipse:控制台出现乱码解决

目录 一、乱码现象 二、解决方法 一、乱码现象 二、解决方法  

额外说明

如何在WordPress菜单中添加标题而不链接页面

最近,我们的一位用户询问我们是否有一种方法可以在 WordPress 菜单中添加标题而不添加链接。默认情况下,WordPress 菜单要求每个菜单项链接到一个页面或自定义链接。但是,在创建下拉菜单时,您可能希望为子菜单添加标题,而不将其链接到特定页面。例

ads via 小工具